#define UNI_SINGLE_HEADER
#pragma once
#include <cstdint>
#include <array>
#include <algorithm>
#include <string_view>
namespace uni {

template<class ForwardIt, class T, class Compare>
constexpr ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp) {
    ForwardIt it = first;
    typename std::iterator_traits<ForwardIt>::difference_type count = std::distance(first, last);
    typename std::iterator_traits<ForwardIt>::difference_type step = count / 2;

    while(count > 0) {
        it = first;
        step = count / 2;
        std::advance(it, step);
        if(!comp(value, *it)) {
            first = ++it;
            count -= step + 1;
        } else
            count = step;
    }
    return first;
}

template<class ForwardIt, class T, class Compare>
constexpr ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp) {
    ForwardIt it = first;
    typename std::iterator_traits<ForwardIt>::difference_type count = std::distance(first, last);
    typename std::iterator_traits<ForwardIt>::difference_type step = count / 2;

    while(count > 0) {
        it = first;
        step = count / 2;
        std::advance(it, step);
        if(comp(*it, value)) {
            first = ++it;
            count -= step + 1;
        } else
            count = step;
    }
    return first;
}

template<class ForwardIt, class T>
constexpr ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value) {
    ForwardIt it = first;
    typename std::iterator_traits<ForwardIt>::difference_type count = std::distance(first, last);
    typename std::iterator_traits<ForwardIt>::difference_type step = count / 2;

    while(count > 0) {
        it = first;
        step = count / 2;
        std::advance(it, step);
        if(*it < value) {
            first = ++it;
            count -= step + 1;
        } else
            count = step;
    }
    return first;
}

template<class ForwardIt, class T>
constexpr bool binary_search(ForwardIt first, ForwardIt last, const T& value) {
    first = uni::lower_bound(first, last, value);
    return (!(first == last) && !(value < *first));
}
template<typename T, auto N>
struct _compact_range {
    std::array<std::uint32_t, N> _data;
    constexpr T value(char32_t cp, T default_value) const {
        const auto end = _data.end();
        auto it = uni::upper_bound(_data.begin(), end, cp, [](char32_t cp, uint32_t v) {
            char32_t c = (v >> 8);
            return cp < c;
        });
        if(it == end)
            return default_value;
        it--;
        return *(it)&0xFF;
    }
};
template<class T, class... U>
_compact_range(T, U...)->_compact_range<T, sizeof...(U) + 1>;


template<typename T, auto N>
struct _compact_list {
    std::array<std::uint32_t, N> _data;
    constexpr T value(char32_t cp, T default_value) const {
        const auto end = _data.end();
        auto it = uni::lower_bound(_data.begin(), end, cp, [](char32_t cp, uint32_t v) {
            char32_t c = (v >> 8);
            return cp < c;
        });
        if(it == end || (*it >> 8) != cp)
            return default_value;
        return *(it)&0xFF;
    }
};
template<class T, class... U>
_compact_list(T, U...)->_compact_list<T, sizeof...(U) + 1>;


template<std::size_t r1_s, std::size_t r2_s, int16_t r2_t_f, int16_t r2_t_b, std::size_t r3_s,
         std::size_t r4_s, int16_t r4_t_f, int16_t r4_t_b, std::size_t r5_s, int16_t r5_t_f,
         int16_t r5_t_b, std::size_t r6_s>
struct __bool_trie {

    // not tries, just bitmaps for all code points 0..0x7FF (UTF-8 1- and 2-byte sequences)
    std::array<std::uint64_t, 32> r1;

    // trie for code points 0x800..0xFFFF (UTF-8 3-byte sequences, aka rest of BMP)
    std::array<std::uint8_t, r2_s> r2;
    std::array<std::uint64_t, r3_s> r3;    // leaves can be shared, so size isn't fixed

    // trie for 0x10000..0x10FFFF (UTF-8 4-byte sequences, aka non-BMP code points)
    std::array<std::uint8_t, r4_s> r4;
    std::array<std::uint8_t, r5_s> r5;     // two level to exploit sparseness of non-BMP
    std::array<std::uint64_t, r6_s> r6;    // again, leaves are shared

    constexpr bool lookup(char32_t u) const {
        std::uint32_t c = u;
        if(c < 0x800) {
            if constexpr(r1_s == 0)
                return false;
            return trie_range_leaf(c, r1[c >> 6]);
        } else if(c < 0x10000) {
            if constexpr(r3_s == 0)
                return false;
            std::size_t i = ((c >> 6) - 0x20);
            auto child = 0;
            if(i >= r2_t_f && i < r2_t_f + r2_s)
                child = r2[i - r2_t_f];

            return trie_range_leaf(c, r3.begin()[child]);
        } else {
            if constexpr(r6_s == 0)
                return false;
            std::size_t i4 = (c >> 12) - 0x10;
            auto child = 0;
            if(i4 >= r4_t_f && i4 < r4_t_f + r4_s)
                child = r4[i4 - r4_t_f];


            std::size_t i5 = (child << 6) + ((c >> 6) & 0x3f);
            auto leaf = 0;
            if(i5 >= r5_t_f && i5 < r5_t_f + r5_s)
                leaf = r5.begin()[i5 - r5_t_f];
            return trie_range_leaf(c, r6.begin()[leaf]);
        }
    }

    constexpr bool trie_range_leaf(std::uint32_t c, std::uint64_t chunk) const {
        return (chunk >> (c & 0b111111)) & 0b1;
    }
};

template<std::size_t size>
struct flat_array {
    std::array<char32_t, size> data;
    constexpr bool lookup(char32_t u) const {
        if constexpr(size < 20) {
            for(auto it = data.begin(); it != data.end(); ++it) {
                if(*it == u)
                    return true;
                if(it == data.end())
                    return false;
            }
        } else {
            return uni::binary_search(data.begin(), data.end(), u);
        }
        return false;
    }
};


template<auto N>
struct __range_array {
    std::array<std::uint32_t, N> _data;
    constexpr bool lookup(char32_t cp) const {
        const auto end = _data.end();
        auto it = uni::upper_bound(_data.begin(), end, cp, [](char32_t cp, uint32_t v) {
            char32_t c = (v >> 8);
            return cp < c;
        });
        if(it == end)
            return false;
        it--;
        return (*it) & 0xFF;
    }
};

template<class... U>
__range_array(U...)->__range_array<sizeof...(U)>;


constexpr char __propcharnorm(char a) {
    if(a >= 'A' && a <= 'Z')
        return a + 32;
    if(a == ' ' || a == '-')
        return '_';
    return a;
}
constexpr int __propcharcomp(char a, char b) {
    a = __propcharnorm(a);
    b = __propcharnorm(b);
    if(a == b)
        return 0;
    if(a < b)
        return -1;
    return 1;
}
constexpr int __pronamecomp(std::string_view sa, std::string_view sb) {
    // workaround, iterators in std::string_view are not constexpr in libc++ (for now)
    const char* a = sa.begin();
    const char* b = sb.begin();

    const char* ae = sa.end();
    const char* be = sb.end();

    for(; a != ae && b != be; a++, b++) {
        auto res = __propcharcomp(*a, *b);
        if(res != 0)
            return res;
    }
    if(sa.size() < sb.size())
        return -1;
    else if(sb.size() < sa.size())
        return 1;
    return 0;
}

}    // namespace uni

namespace uni {


enum class script;
enum class block;
enum class category;
enum class property;
enum class version : uint8_t;

template<uni::script>
bool cp_is(char32_t) = delete;


template<uni::property>
bool cp_is(char32_t) = delete;


constexpr version cp_age(char32_t cp);
constexpr block cp_block(char32_t cp);

constexpr bool cp_is_valid(char32_t cp);
constexpr bool cp_is_assigned(char32_t cp);
constexpr bool cp_is_ascii(char32_t cp);

struct numeric_value {

    constexpr double value() const {
        return numerator() / double(_d);
    }

    constexpr long long numerator() const {
        return _n;
    }

    constexpr int denominator() const {
        return _d;
    }

    constexpr bool is_valid() const {
        return _d != 0;
    }

protected:
    constexpr numeric_value() = default;
    constexpr numeric_value(long long n, int16_t d) : _n(n), _d(d) {}

    long long _n = 0;
    int16_t _d = 0;
    friend constexpr numeric_value cp_numeric_value(char32_t cp);
};

constexpr numeric_value cp_numeric_value(char32_t cp);


}    // namespace uni

namespace uni {
struct __string_with_idx {
    const char* name;
    uint32_t value;
};
enum class version : uint8_t {
    unassigned,
    v1_1,
    v2_0,
    v2_1,
    v3_0,
    v3_1,
    v3_2,
    v4_0,
    v4_1,
    v5_0,
    v5_1,
    v5_2,
    v6_0,
    v6_1,
    v6_2,
    v6_3,
    v7_0,
    v8_0,
    v9_0,
    v10_0,
    v11_0,
    v12_0,
    standard_unicode_version = v12_0,
    minimum_version = v10_0,
    latest_version = v12_0
};
static constexpr std::array __age_strings = {
    "unassigned", "1.1", "2.0", "2.1", "3.0", "3.1", "3.2", "4.0", "4.1",  "5.0",  "5.1",
    "5.2",        "6.0", "6.1", "6.2", "6.3", "7.0", "8.0", "9.0", "10.0", "11.0", "12.0"};
static constexpr _compact_range __age_data = {
    0x00000001, 0x0001F604, 0x0001FA01, 0x00021804, 0x00022006, 0x00022107, 0x00022204, 0x00023407,
    0x00023708, 0x00024209, 0x00025001, 0x0002A904, 0x0002AE07, 0x0002B001, 0x0002DF04, 0x0002E001,
    0x0002EA04, 0x0002EF07, 0x00030001, 0x00034604, 0x00034F06, 0x00035007, 0x00035808, 0x00035D07,
    0x00036001, 0x00036204, 0x00036306, 0x0003700A, 0x00037401, 0x0003760A, 0x00037800, 0x00037A01,
    0x00037B09, 0x00037E01, 0x00037F10, 0x00038000, 0x00038401, 0x00038B00, 0x00038C01, 0x00038D00,
    0x00038E01, 0x0003A200, 0x0003A301, 0x0003CF0A, 0x0003D001, 0x0003D704, 0x0003D806, 0x0003DA01,
    0x0003DB04, 0x0003DC01, 0x0003DD04, 0x0003DE01, 0x0003DF04, 0x0003E001, 0x0003E104, 0x0003E201,
    0x0003F405, 0x0003F606, 0x0003F707, 0x0003FC08, 0x00040004, 0x00040101, 0x00040D04, 0x00040E01,
    0x00045004, 0x00045101, 0x00045D04, 0x00045E01, 0x0004870A, 0x00048804, 0x00048A06, 0x00048C04,
    0x00049001, 0x0004C506, 0x0004C701, 0x0004C906, 0x0004CB01, 0x0004CD06, 0x0004CF09, 0x0004D001,
    0x0004EC04, 0x0004EE01, 0x0004F608, 0x0004F801, 0x0004FA09, 0x00050006, 0x00051009, 0x0005140A,
    0x0005240B, 0x0005260C, 0x00052810, 0x00053000, 0x00053101, 0x00055700, 0x00055901, 0x00056014,
    0x00056101, 0x00058814, 0x00058901, 0x00058A04, 0x00058B00, 0x00058D10, 0x00058F0D, 0x00059000,
    0x00059102, 0x0005A208, 0x0005A302, 0x0005B001, 0x0005BA09, 0x0005BB01, 0x0005C402, 0x0005C508,
    0x0005C800, 0x0005D001, 0x0005EB00, 0x0005EF14, 0x0005F001, 0x0005F500, 0x00060007, 0x0006040D,
    0x00060510, 0x0006060A, 0x00060B08, 0x00060C01, 0x00060D07, 0x0006160A, 0x00061B01, 0x00061C0F,
    0x00061D00, 0x00061E08, 0x00061F01, 0x0006200C, 0x00062101, 0x00063B0A, 0x00064001, 0x00065304,
    0x00065607, 0x00065908, 0x00065F0C, 0x00066001, 0x00066E06, 0x00067001, 0x0006B804, 0x0006BA01,
    0x0006BF04, 0x0006C001, 0x0006CF04, 0x0006D001, 0x0006EE07, 0x0006F001, 0x0006FA04, 0x0006FF07,
    0x00070004, 0x00070E00, 0x00070F04, 0x00072D07, 0x00073004, 0x00074B00, 0x00074D07, 0x00075008,
    0x00076E0A, 0x00078004, 0x0007B106, 0x0007B200, 0x0007C009, 0x0007FB00, 0x0007FD14, 0x0008000B,
    0x00082E00, 0x0008300B, 0x00083F00, 0x0008400C, 0x00085C00, 0x00085E0C, 0x00085F00, 0x00086013,
    0x00086B00, 0x0008A00D, 0x0008A110, 0x0008A20D, 0x0008AD10, 0x0008B311, 0x0008B500, 0x0008B612,
    0x0008BE00, 0x0008D314, 0x0008D412, 0x0008E311, 0x0008E40D, 0x0008FF10, 0x0009000B, 0x00090101,
    0x00090407, 0x00090501, 0x00093A0C, 0x00093C01, 0x00094E0B, 0x00094F0C, 0x00095001, 0x0009550B,
    0x0009560C, 0x00095801, 0x0009710A, 0x0009730C, 0x00097810, 0x0009790B, 0x00097B09, 0x00097D08,
    0x00097E09, 0x00098010, 0x00098101, 0x00098400, 0x00098501, 0x00098D00, 0x00098F01, 0x00099100,
    0x00099301, 0x0009A900, 0x0009AA01, 0x0009B100, 0x0009B201, 0x0009B300, 0x0009B601, 0x0009BA00,
    0x0009BC01, 0x0009BD07, 0x0009BE01, 0x0009C500, 0x0009C701, 0x0009C900, 0x0009CB01, 0x0009CE08,
    0x0009CF00, 0x0009D701, 0x0009D800, 0x0009DC01, 0x0009DE00, 0x0009DF01, 0x0009E400, 0x0009E601,
    0x0009FB0B, 0x0009FC13, 0x0009FE14, 0x0009FF00, 0x000A0107, 0x000A0201, 0x000A0307, 0x000A0400,
    0x000A0501, 0x000A0B00, 0x000A0F01, 0x000A1100, 0x000A1301, 0x000A2900, 0x000A2A01, 0x000A3100,
    0x000A3201, 0x000A3400, 0x000A3501, 0x000A3700, 0x000A3801, 0x000A3A00, 0x000A3C01, 0x000A3D00,
    0x000A3E01, 0x000A4300, 0x000A4701, 0x000A4900, 0x000A4B01, 0x000A4E00, 0x000A510A, 0x000A5200,
    0x000A5901, 0x000A5D00, 0x000A5E01, 0x000A5F00, 0x000A6601, 0x000A750A, 0x000A7614, 0x000A7700,
    0x000A8101, 0x000A8400, 0x000A8501, 0x000A8C07, 0x000A8D01, 0x000A8E00, 0x000A8F01, 0x000A9200,
    0x000A9301, 0x000AA900, 0x000AAA01, 0x000AB100, 0x000AB201, 0x000AB400, 0x000AB501, 0x000ABA00,
    0x000ABC01, 0x000AC600, 0x000AC701, 0x000ACA00, 0x000ACB01, 0x000ACE00, 0x000AD001, 0x000AD100,
    0x000AE001, 0x000AE107, 0x000AE400, 0x000AE601, 0x000AF00D, 0x000AF107, 0x000AF200, 0x000AF911,
    0x000AFA13, 0x000B0000, 0x000B0101, 0x000B0400, 0x000B0501, 0x000B0D00, 0x000B0F01, 0x000B1100,
    0x000B1301, 0x000B2900, 0x000B2A01, 0x000B3100, 0x000B3201, 0x000B3400, 0x000B3507, 0x000B3601,
    0x000B3A00, 0x000B3C01, 0x000B440A, 0x000B4500, 0x000B4701, 0x000B4900, 0x000B4B01, 0x000B4E00,
    0x000B5601, 0x000B5800, 0x000B5C01, 0x000B5E00, 0x000B5F01, 0x000B620A, 0x000B6400, 0x000B6601,
    0x000B7107, 0x000B720C, 0x000B7800, 0x000B8201, 0x000B8400, 0x000B8501, 0x000B8B00, 0x000B8E01,
    0x000B9100, 0x000B9201, 0x000B9600, 0x000B9901, 0x000B9B00, 0x000B9C01, 0x000B9D00, 0x000B9E01,
    0x000BA000, 0x000BA301, 0x000BA500, 0x000BA801, 0x000BAB00, 0x000BAE01, 0x000BB608, 0x000BB701,
    0x000BBA00, 0x000BBE01, 0x000BC300, 0x000BC601, 0x000BC900, 0x000BCA01, 0x000BCE00, 0x000BD00A,
    0x000BD100, 0x000BD701, 0x000BD800, 0x000BE608, 0x000BE701, 0x000BF307, 0x000BFB00, 0x000C0010,
    0x000C0101, 0x000C0414, 0x000C0501, 0x000C0D00, 0x000C0E01, 0x000C1100, 0x000C1201, 0x000C2900,
    0x000C2A01, 0x000C3410, 0x000C3501, 0x000C3A00, 0x000C3D0A, 0x000C3E01, 0x000C4500, 0x000C4601,
    0x000C4900, 0x000C4A01, 0x000C4E00, 0x000C5501, 0x000C5700, 0x000C580A, 0x000C5A11, 0x000C5B00,
    0x000C6001, 0x000C620A, 0x000C6400, 0x000C6601, 0x000C7000, 0x000C7715, 0x000C780A, 0x000C8012,
    0x000C8110, 0x000C8201, 0x000C8414, 0x000C8501, 0x000C8D00, 0x000C8E01, 0x000C9100, 0x000C9201,
    0x000CA900, 0x000CAA01, 0x000CB400, 0x000CB501, 0x000CBA00, 0x000CBC07, 0x000CBE01, 0x000CC500,
    0x000CC601, 0x000CC900, 0x000CCA01, 0x000CCE00, 0x000CD501, 0x000CD700, 0x000CDE01, 0x000CDF00,
    0x000CE001, 0x000CE209, 0x000CE400, 0x000CE601, 0x000CF000, 0x000CF109, 0x000CF300, 0x000D0013,
    0x000D0110, 0x000D0201, 0x000D0400, 0x000D0501, 0x000D0D00, 0x000D0E01, 0x000D1100, 0x000D1201,
    0x000D290C, 0x000D2A01, 0x000D3A0C, 0x000D3B13, 0x000D3D0A, 0x000D3E01, 0x000D440A, 0x000D4500,
    0x000D4601, 0x000D4900, 0x000D4A01, 0x000D4E0C, 0x000D4F12, 0x000D5000, 0x000D5412, 0x000D5701,
    0x000D5812, 0x000D5F11, 0x000D6001, 0x000D620A, 0x000D6400, 0x000D6601, 0x000D700A, 0x000D7612,
    0x000D790A, 0x000D8000, 0x000D8204, 0x000D8400, 0x000D8504, 0x000D9700, 0x000D9A04, 0x000DB200,
    0x000DB304, 0x000DBC00, 0x000DBD04, 0x000DBE00, 0x000DC004, 0x000DC700, 0x000DCA04, 0x000DCB00,
    0x000DCF04, 0x000DD500, 0x000DD604, 0x000DD700, 0x000DD804, 0x000DE000, 0x000DE610, 0x000DF000,
    0x000DF204, 0x000DF500, 0x000E0101, 0x000E3B00, 0x000E3F01, 0x000E5C00, 0x000E8101, 0x000E8300,
    0x000E8401, 0x000E8500, 0x000E8615, 0x000E8701, 0x000E8915, 0x000E8A01, 0x000E8B00, 0x000E8C15,
    0x000E8D01, 0x000E8E15, 0x000E9401, 0x000E9815, 0x000E9901, 0x000EA015, 0x000EA101, 0x000EA400,
    0x000EA501, 0x000EA600, 0x000EA701, 0x000EA815, 0x000EAA01, 0x000EAC15, 0x000EAD01, 0x000EBA15,
    0x000EBB01, 0x000EBE00, 0x000EC001, 0x000EC500, 0x000EC601, 0x000EC700, 0x000EC801, 0x000ECE00,
    0x000ED001, 0x000EDA00, 0x000EDC01, 0x000EDE0D, 0x000EE000, 0x000F0002, 0x000F4800, 0x000F4902,
    0x000F6A04, 0x000F6B0A, 0x000F6D00, 0x000F7102, 0x000F8C0C, 0x000F9002, 0x000F9604, 0x000F9702,
    0x000F9800, 0x000F9902, 0x000FAE04, 0x000FB102, 0x000FB804, 0x000FB902, 0x000FBA04, 0x000FBD00,
    0x000FBE04, 0x000FCD00, 0x000FCE0A, 0x000FCF04, 0x000FD008, 0x000FD20A, 0x000FD50B, 0x000FD90C,
    0x000FDB00, 0x00100004, 0x0010220A, 0x00102304, 0x0010280A, 0x00102904, 0x00102B0A, 0x00102C04,
    0x0010330A, 0x00103604, 0x00103A0A, 0x00104004, 0x00105A0A, 0x00109A0B, 0x00109E0A, 0x0010A001,
    0x0010C600, 0x0010C70D, 0x0010C800, 0x0010CD0D, 0x0010CE00, 0x0010D001, 0x0010F706, 0x0010F908,
    0x0010FB01, 0x0010FC08, 0x0010FD0D, 0x00110001, 0x00115A0B, 0x00115F01, 0x0011A30B, 0x0011A801,
    0x0011FA0B, 0x00120004, 0x00120708, 0x00120804, 0x00124708, 0x00124804, 0x00124900, 0x00124A04,
    0x00124E00, 0x00125004, 0x00125700, 0x00125804, 0x00125900, 0x00125A04, 0x00125E00, 0x00126004,
    0x00128708, 0x00128804, 0x00128900, 0x00128A04, 0x00128E00, 0x00129004, 0x0012AF08, 0x0012B004,
    0x0012B100, 0x0012B204, 0x0012B600, 0x0012B804, 0x0012BF00, 0x0012C004, 0x0012C100, 0x0012C204,
    0x0012C600, 0x0012C804, 0x0012CF08, 0x0012D004, 0x0012D700, 0x0012D804, 0x0012EF08, 0x0012F004,
    0x00130F08, 0x00131004, 0x00131100, 0x00131204, 0x00131600, 0x00131804, 0x00131F08, 0x00132004,
    0x00134708, 0x00134804, 0x00135B00, 0x00135D0C, 0x00135F08, 0x00136104, 0x00137D00, 0x00138008,
    0x00139A00, 0x0013A004, 0x0013F511, 0x0013F600, 0x0013F811, 0x0013FE00, 0x0014000B, 0x00140104,
    0x0016770B, 0x00168004, 0x00169D00, 0x0016A004, 0x0016F110, 0x0016F900, 0x00170006, 0x00170D00,
    0x00170E06, 0x00171500, 0x00172006, 0x00173700, 0x00174006, 0x00175400, 0x00176006, 0x00176D00,
    0x00176E06, 0x00177100, 0x00177206, 0x00177400, 0x00178004, 0x0017DD07, 0x0017DE00, 0x0017E004,
    0x0017EA00, 0x0017F007, 0x0017FA00, 0x00180004, 0x00180F00, 0x00181004, 0x00181A00, 0x00182004,
    0x00187814, 0x00187900, 0x00188004, 0x0018AA0A, 0x0018AB00, 0x0018B00B, 0x0018F600, 0x00190007,
    0x00191D10, 0x00191F00, 0x00192007, 0x00192C00, 0x00193007, 0x00193C00, 0x00194007, 0x00194100,
    0x00194407, 0x00196E00, 0x00197007, 0x00197500, 0x00198008, 0x0019AA0B, 0x0019AC00, 0x0019B008,
    0x0019CA00, 0x0019D008, 0x0019DA0B, 0x0019DB00, 0x0019DE08, 0x0019E007, 0x001A0008, 0x001A1C00,
    0x001A1E08, 0x001A200B, 0x001A5F00, 0x001A600B, 0x001A7D00, 0x001A7F0B, 0x001A8A00, 0x001A900B,
    0x001A9A00, 0x001AA00B, 0x001AAE00, 0x001AB010, 0x001ABF00, 0x001B0009, 0x001B4C00, 0x001B5009,
    0x001B7D00, 0x001B800A, 0x001BAB0D, 0x001BAE0A, 0x001BBA0D, 0x001BC00C, 0x001BF400, 0x001BFC0C,
    0x001C000A, 0x001C3800, 0x001C3B0A, 0x001C4A00, 0x001C4D0A, 0x001C8012, 0x001C8900, 0x001C9014,
    0x001CBB00, 0x001CBD14, 0x001CC00D, 0x001CC800, 0x001CD00B, 0x001CF30D, 0x001CF713, 0x001CF810,
    0x001CFA15, 0x001CFB00, 0x001D0007, 0x001D6C08, 0x001DC409, 0x001DCB0A, 0x001DE710, 0x001DF613,
    0x001DFA00, 0x001DFB12, 0x001DFC0C, 0x001DFD0B, 0x001DFE09, 0x001E0001, 0x001E9B02, 0x001E9C0A,
    0x001EA001, 0x001EFA0A, 0x001F0001, 0x001F1600, 0x001F1801, 0x001F1E00, 0x001F2001, 0x001F4600,
    0x001F4801, 0x001F4E00, 0x001F5001, 0x001F5800, 0x001F5901, 0x001F5A00, 0x001F5B01, 0x001F5C00,
    0x001F5D01, 0x001F5E00, 0x001F5F01, 0x001F7E00, 0x001F8001, 0x001FB500, 0x001FB601, 0x001FC500,
    0x001FC601, 0x001FD400, 0x001FD601, 0x001FDC00, 0x001FDD01, 0x001FF000, 0x001FF201, 0x001FF500,
    0x001FF601, 0x001FFF00, 0x00200001, 0x00202F04, 0x00203001, 0x00204706, 0x00204804, 0x00204E06,
    0x00205307, 0x00205508, 0x00205706, 0x00205808, 0x00205F06, 0x0020640A, 0x00206500, 0x0020660F,
    0x00206A01, 0x00207106, 0x00207200, 0x00207401, 0x00208F00, 0x00209008, 0x0020950C, 0x00209D00,
    0x0020A001, 0x0020AB02, 0x0020AC03, 0x0020AD04, 0x0020B006, 0x0020B208, 0x0020B60B, 0x0020B90C,
    0x0020BA0E, 0x0020BB10, 0x0020BE11, 0x0020BF13, 0x0020C000, 0x0020D001, 0x0020E204, 0x0020E406,
    0x0020EB08, 0x0020EC09, 0x0020F00A, 0x0020F100, 0x00210001, 0x00213904, 0x00213B07, 0x00213C08,
    0x00213D06, 0x00214C08, 0x00214D09, 0x00214F0A, 0x0021500B, 0x00215301, 0x00218304, 0x00218409,
    0x0021850A, 0x0021890B, 0x00218A11, 0x00218C00, 0x00219001, 0x0021EB04, 0x0021F406, 0x00220001,
    0x0022F206, 0x00230001, 0x00230104, 0x00230201, 0x00237B04, 0x00237C06, 0x00237D04, 0x00239B06,
    0x0023CF07, 0x0023D108, 0x0023DC09, 0x0023E80B, 0x0023E90C, 0x0023F410, 0x0023FB12, 0x0023FF13,
    0x00240001, 0x00242504, 0x00242700, 0x00244001, 0x00244B00, 0x00246001, 0x0024EB06, 0x0024FF07,
    0x00250001, 0x00259606, 0x0025A001, 0x0025F004, 0x0025F806, 0x00260001, 0x00261407, 0x00261606,
    0x00261808, 0x00261904, 0x00261A01, 0x00267004, 0x00267206, 0x00267E08, 0x00268006, 0x00268A07,
    0x00269208, 0x00269D0A, 0x00269E0B, 0x0026A007, 0x0026A208, 0x0026B209, 0x0026B30A, 0x0026BD0B,
    0x0026C00A, 0x0026C40B, 0x0026CE0C, 0x0026CF0B, 0x0026E20C, 0x0026E30B, 0x0026E40C, 0x0026E80B,
    0x00270010, 0x00270101, 0x0027050C, 0x00270601, 0x00270A0C, 0x00270C01, 0x0027280C, 0x00272901,
    0x00274C0C, 0x00274D01, 0x00274E0C, 0x00274F01, 0x0027530C, 0x00275601, 0x0027570B, 0x00275801,
    0x00275F0C, 0x00276101, 0x00276806, 0x00277601, 0x0027950C, 0x00279801, 0x0027B00C, 0x0027B101,
    0x0027BF0C, 0x0027C008, 0x0027C709, 0x0027CB0D, 0x0027CC0A, 0x0027CD0D, 0x0027CE0C, 0x0027D006,
    0x0027EC0A, 0x0027F006, 0x00280004, 0x00290006, 0x002B0007, 0x002B0E08, 0x002B1409, 0x002B1B0A,
    0x002B2009, 0x002B240A, 0x002B4D10, 0x002B500A, 0x002B550B, 0x002B5A10, 0x002B7400, 0x002B7610,
    0x002B9600, 0x002B9810, 0x002BBA14, 0x002BBD10, 0x002BC915, 0x002BCA10, 0x002BD213, 0x002BD314,
    0x002BEC11, 0x002BF014, 0x002BFF15, 0x002C0008, 0x002C2F00, 0x002C3008, 0x002C5F00, 0x002C6009,
    0x002C6D0A, 0x002C700B, 0x002C710A, 0x002C7409, 0x002C780A, 0x002C7E0B, 0x002C8008, 0x002CEB0B,
    0x002CF20D, 0x002CF400, 0x002CF908, 0x002D2600, 0x002D270D, 0x002D2800, 0x002D2D0D, 0x002D2E00,
    0x002D3008, 0x002D660D, 0x002D6800, 0x002D6F08, 0x002D700C, 0x002D7100, 0x002D7F0C, 0x002D8008,
    0x002D9700, 0x002DA008, 0x002DA700, 0x002DA808, 0x002DAF00, 0x002DB008, 0x002DB700, 0x002DB808,
    0x002DBF00, 0x002DC008, 0x002DC700, 0x002DC808, 0x002DCF00, 0x002DD008, 0x002DD700, 0x002DD808,
    0x002DDF00, 0x002DE00A, 0x002E0008, 0x002E180A, 0x002E1C08, 0x002E1E0A, 0x002E310B, 0x002E320D,
    0x002E3C10, 0x002E4312, 0x002E4513, 0x002E4A14, 0x002E4F15, 0x002E5000, 0x002E8004, 0x002E9A00,
    0x002E9B04, 0x002EF400, 0x002F0004, 0x002FD600, 0x002FF004, 0x002FFC00, 0x00300001, 0x00303804,
    0x00303B06, 0x00303E04, 0x00303F01, 0x00304000, 0x00304101, 0x00309506, 0x00309700, 0x00309901,
    0x00309F06, 0x0030A101, 0x0030FF06, 0x00310000, 0x00310501, 0x00312D0A, 0x00312E13, 0x00312F14,
    0x00313000, 0x00313101, 0x00318F00, 0x00319001, 0x0031A004, 0x0031B80C, 0x0031BB00, 0x0031C008,
    0x0031D00A, 0x0031E400, 0x0031F006, 0x00320001, 0x00321D07, 0x00321F00, 0x00322001, 0x0032440B,
    0x00325007, 0x00325106, 0x00326001, 0x00327C07, 0x00327E08, 0x00327F01, 0x0032B106, 0x0032C001,
    0x0032CC07, 0x0032D001, 0x0032FF00, 0x00330001, 0x00337707, 0x00337B01, 0x0033DE07, 0x0033E001,
    0x0033FF07, 0x00340000, 0x00340304, 0x00340400, 0x00340504, 0x00340600, 0x00348104, 0x00348200,
    0x00348304, 0x00348400, 0x00382804, 0x00382900, 0x00382A04, 0x00382B00, 0x003B4B04, 0x003B4C00,
    0x003B4D04, 0x003B4E00, 0x004DB404, 0x004DB500, 0x004DC007, 0x004E0001, 0x004E0200, 0x004E0301,
    0x004E0400, 0x004E0501, 0x004E0600, 0x004E0701, 0x004E0A00, 0x004E5B01, 0x004E5C00, 0x004E5D01,
    0x004E5E00, 0x004E8A01, 0x004E8B00, 0x004E8C01, 0x004E8D00, 0x004E9201, 0x004E9300, 0x004E9401,
    0x004E9700, 0x004EBD01, 0x004EBE00, 0x004EBF01, 0x004EC100, 0x004EDD01, 0x004EDE00, 0x004EDF01,
    0x004EE000, 0x004EE601, 0x004EE700, 0x004EE801, 0x004EE900, 0x004F0B01, 0x004F0C00, 0x004F0D01,
    0x004F0E00, 0x004F6E01, 0x004F6F00, 0x004F7001, 0x004F7100, 0x00510201, 0x00510300, 0x00510401,
    0x00510500, 0x00514401, 0x00514500, 0x00514601, 0x00514700, 0x00516701, 0x00516800, 0x00516901,
    0x00516E00, 0x00533F01, 0x00534000, 0x00534101, 0x00534600, 0x00534A01, 0x00534B00, 0x00534C01,
    0x00534D00, 0x0053BF01, 0x0053C000, 0x0053C101, 0x0053C500, 0x0056D901, 0x0056DA00, 0x0056DB01,
    0x0056DC00, 0x0058EF01, 0x0058F000, 0x0058F101, 0x0058F200, 0x0058F701, 0x0058F800, 0x0058F901,
    0x0058FA00, 0x005E7801, 0x005E7900, 0x005E7A01, 0x005E7B00, 0x005EFC01, 0x005EFD00, 0x005EFE01,
    0x005F0000, 0x005F0A01, 0x005F0B00, 0x005F0C01, 0x005F1100, 0x0062FC01, 0x0062FD00, 0x0062FE01,
    0x0062FF00, 0x00634A01, 0x00634B00, 0x00634C01, 0x00634D00, 0x0067D001, 0x0067D100, 0x0067D201,
    0x0067D300, 0x006F0401, 0x006F0500, 0x006F0601, 0x006F0700, 0x00739401, 0x00739500, 0x00739601,
    0x00739700, 0x00767C01, 0x00767D00, 0x00767E01, 0x00767F00, 0x00808401, 0x00808500, 0x00808601,
    0x00808700, 0x00842A01, 0x00842B00, 0x00842C01, 0x00842D00, 0x008CAC01, 0x008CAD00, 0x008CAE01,
    0x008CAF00, 0x008CB101, 0x008CB200, 0x008CB301, 0x008CB400, 0x008D2E01, 0x008D2F00, 0x008D3001,
    0x008D3100, 0x00961F01, 0x00962000, 0x00962101, 0x00962200, 0x00964401, 0x00964500, 0x00964601,
    0x00964700, 0x00964A01, 0x00964B00, 0x00964C01, 0x00964D00, 0x00967601, 0x00967700, 0x00967801,
    0x00967900, 0x0096F401, 0x0096F500, 0x0096F601, 0x0096F700, 0x009FA401, 0x009FA500, 0x009FBA08,
    0x009FBB00, 0x009FC20A, 0x009FC300, 0x009FCA0B, 0x009FCB00, 0x009FCC0D, 0x009FCD00, 0x009FD411,
    0x009FD500, 0x009FE913, 0x009FEA00, 0x009FEE14, 0x009FEF00, 0x00A00004, 0x00A48D00, 0x00A49004,
    0x00A4A206, 0x00A4A404, 0x00A4B406, 0x00A4B504, 0x00A4C106, 0x00A4C204, 0x00A4C506, 0x00A4C604,
    0x00A4C700, 0x00A4D00B, 0x00A5000A, 0x00A62C00, 0x00A6400A, 0x00A6600C, 0x00A6620A, 0x00A6740D,
    0x00A67C0A, 0x00A69810, 0x00A69E11, 0x00A69F0D, 0x00A6A00B, 0x00A6F800, 0x00A70008, 0x00A71709,
    0x00A71B0A, 0x00A72009, 0x00A7220A, 0x00A78D0C, 0x00A78F11, 0x00A7900C, 0x00A7920D, 0x00A79410,
    0x00A7A00C, 0x00A7AA0D, 0x00A7AB10, 0x00A7AE12, 0x00A7AF14, 0x00A7B010, 0x00A7B211, 0x00A7B814,
    0x00A7BA15, 0x00A7C000, 0x00A7C215, 0x00A7C700, 0x00A7F710, 0x00A7F80D, 0x00A7FA0C, 0x00A7FB0A,
    0x00A80008, 0x00A82C00, 0x00A8300B, 0x00A83A00, 0x00A84009, 0x00A87800, 0x00A8800A, 0x00A8C512,
    0x00A8C600, 0x00A8CE0A, 0x00A8DA00, 0x00A8E00B, 0x00A8FC11, 0x00A8FE14, 0x00A9000A, 0x00A95400,
    0x00A95F0A, 0x00A9600B, 0x00A97D00, 0x00A9800B, 0x00A9CE00, 0x00A9CF0B, 0x00A9DA00, 0x00A9DE0B,
    0x00A9E010, 0x00A9FF00, 0x00AA000A, 0x00AA3700, 0x00AA400A, 0x00AA4E00, 0x00AA500A, 0x00AA5A00,
    0x00AA5C0A, 0x00AA600B, 0x00AA7C10, 0x00AA800B, 0x00AAC300, 0x00AADB0B, 0x00AAE00D, 0x00AAF700,
    0x00AB010C, 0x00AB0700, 0x00AB090C, 0x00AB0F00, 0x00AB110C, 0x00AB1700, 0x00AB200C, 0x00AB2700,
    0x00AB280C, 0x00AB2F00, 0x00AB3010, 0x00AB6011, 0x00AB6410, 0x00AB6615, 0x00AB6800, 0x00AB7011,
    0x00ABC00B, 0x00ABEE00, 0x00ABF00B, 0x00ABFA00, 0x00AC0002, 0x00D7A400, 0x00D7B00B, 0x00D7C700,
    0x00D7CB0B, 0x00D7FC00, 0x00DB7E02, 0x00DB7F00, 0x00DBFE02, 0x00DBFF00, 0x00DFFE02, 0x00DFFF00,
    0x00F8FE01, 0x00F8FF00, 0x00F90001, 0x00FA2E0D, 0x00FA3006, 0x00FA6B0B, 0x00FA6E00, 0x00FA7008,
    0x00FADA00, 0x00FB0001, 0x00FB0700, 0x00FB1301, 0x00FB1800, 0x00FB1D04, 0x00FB1E01, 0x00FB3700,
    0x00FB3801, 0x00FB3D00, 0x00FB3E01, 0x00FB3F00, 0x00FB4001, 0x00FB4200, 0x00FB4301, 0x00FB4500,
    0x00FB4601, 0x00FBB20C, 0x00FBC200, 0x00FBD301, 0x00FD4000, 0x00FD5001, 0x00FD9000, 0x00FD9201,
    0x00FDC800, 0x00FDF001, 0x00FDFC06, 0x00FDFD07, 0x00FDFE00, 0x00FE0006, 0x00FE1008, 0x00FE1A00,
    0x00FE2001, 0x00FE240A, 0x00FE2710, 0x00FE2E11, 0x00FE3001, 0x00FE4506, 0x00FE4707, 0x00FE4901,
    0x00FE5300, 0x00FE5401, 0x00FE6700, 0x00FE6801, 0x00FE6C00, 0x00FE7001, 0x00FE7306, 0x00FE7401,
    0x00FE7500, 0x00FE7601, 0x00FEFD00, 0x00FEFF01, 0x00FF0000, 0x00FF0101, 0x00FF5F06, 0x00FF6101,
    0x00FFBF00, 0x00FFC201, 0x00FFC800, 0x00FFCA01, 0x00FFD000, 0x00FFD201, 0x00FFD800, 0x00FFDA01,
    0x00FFDD00, 0x00FFE001, 0x00FFE700, 0x00FFE801, 0x00FFEF00, 0x00FFF904, 0x00FFFC03, 0x00FFFD01,
    0x00FFFE00, 0x01000007, 0x01000C00, 0x01000D07, 0x01002700, 0x01002807, 0x01003B00, 0x01003C07,
    0x01003E00, 0x01003F07, 0x01004E00, 0x01005007, 0x01005E00, 0x01008007, 0x0100FB00, 0x01010007,
    0x01010300, 0x01010707, 0x01013400, 0x01013707, 0x01014008, 0x01018B10, 0x01018D12, 0x01018F00,
    0x0101900A, 0x01019C00, 0x0101A010, 0x0101A100, 0x0101D00A, 0x0101FE00, 0x0102800A, 0x01029D00,
    0x0102A00A, 0x0102D100, 0x0102E010, 0x0102FC00, 0x01030005, 0x01031F10, 0x01032005, 0x01032400,
    0x01032D13, 0x01033005, 0x01034B00, 0x01035010, 0x01037B00, 0x01038007, 0x01039E00, 0x01039F07,
    0x0103A008, 0x0103C400, 0x0103C808, 0x0103D600, 0x01040005, 0x01042607, 0x01042805, 0x01044E07,
    0x01049E00, 0x0104A007, 0x0104AA00, 0x0104B012, 0x0104D400, 0x0104D812, 0x0104FC00, 0x01050010,
    0x01052800, 0x01053010, 0x01056400, 0x01056F10, 0x01057000, 0x01060010, 0x01073700, 0x01074010,
    0x01075600, 0x01076010, 0x01076800, 0x01080007, 0x01080600, 0x01080807, 0x01080900, 0x01080A07,
    0x01083600, 0x01083707, 0x01083900, 0x01083C07, 0x01083D00, 0x01083F07, 0x0108400B, 0x01085600,
    0x0108570B, 0x01086010, 0x01089F00, 0x0108A710, 0x0108B000, 0x0108E011, 0x0108F300, 0x0108F411,
    0x0108F600, 0x0108FB11, 0x01090009, 0x01091A0B, 0x01091C00, 0x01091F09, 0x0109200A, 0x01093A00,
    0x01093F0A, 0x01094000, 0x0109800D, 0x0109B800, 0x0109BC11, 0x0109BE0D, 0x0109C011, 0x0109D000,
    0x0109D211, 0x010A0008, 0x010A0400, 0x010A0508, 0x010A0700, 0x010A0C08, 0x010A1400, 0x010A1508,
    0x010A1800, 0x010A1908, 0x010A3414, 0x010A3600, 0x010A3808, 0x010A3B00, 0x010A3F08, 0x010A4814,
    0x010A4900, 0x010A5008, 0x010A5900, 0x010A600B, 0x010A8010, 0x010AA000, 0x010AC010, 0x010AE700,
    0x010AEB10, 0x010AF700, 0x010B000B, 0x010B3600, 0x010B390B, 0x010B5600, 0x010B580B, 0x010B7300,
    0x010B780B, 0x010B8010, 0x010B9200, 0x010B9910, 0x010B9D00, 0x010BA910, 0x010BB000, 0x010C000B,
    0x010C4900, 0x010C8011, 0x010CB300, 0x010CC011, 0x010CF300, 0x010CFA11, 0x010D0014, 0x010D2800,
    0x010D3014, 0x010D3A00, 0x010E600B, 0x010E7F00, 0x010F0014, 0x010F2800, 0x010F3014, 0x010F5A00,
    0x010FE015, 0x010FF700, 0x0110000C, 0x01104E00, 0x0110520C, 0x01107000, 0x01107F10, 0x0110800B,
    0x0110C200, 0x0110CD14, 0x0110CE00, 0x0110D00D, 0x0110E900, 0x0110F00D, 0x0110FA00, 0x0111000D,
    0x01113500, 0x0111360D, 0x01114414, 0x01114700, 0x01115010, 0x01117700, 0x0111800D, 0x0111C911,
    0x0111CD10, 0x0111CE00, 0x0111D00D, 0x0111DA10, 0x0111DB11, 0x0111E000, 0x0111E110, 0x0111F500,
    0x01120010, 0x01121200, 0x01121310, 0x01123E12, 0x01123F00, 0x01128011, 0x01128700, 0x01128811,
    0x01128900, 0x01128A11, 0x01128E00, 0x01128F11, 0x01129E00, 0x01129F11, 0x0112AA00, 0x0112B010,
    0x0112EB00, 0x0112F010, 0x0112FA00, 0x01130011, 0x01130110, 0x01130400, 0x01130510, 0x01130D00,
    0x01130F10, 0x01131100, 0x01131310, 0x01132900, 0x01132A10, 0x01133100, 0x01133210, 0x01133400,
    0x01133510, 0x01133A00, 0x01133B14, 0x01133C10, 0x01134500, 0x01134710, 0x01134900, 0x01134B10,
    0x01134E00, 0x01135011, 0x01135100, 0x01135710, 0x01135800, 0x01135D10, 0x01136400, 0x01136610,
    0x01136D00, 0x01137010, 0x01137500, 0x01140012, 0x01145A00, 0x01145B12, 0x01145C00, 0x01145D12,
    0x01145E14, 0x01145F15, 0x01146000, 0x01148010, 0x0114C800, 0x0114D010, 0x0114DA00, 0x01158010,
    0x0115B600, 0x0115B810, 0x0115CA11, 0x0115DE00, 0x01160010, 0x01164500, 0x01165010, 0x01165A00,
    0x01166012, 0x01166D00, 0x0116800D, 0x0116B815, 0x0116B900, 0x0116C00D, 0x0116CA00, 0x01170011,
    0x01171A14, 0x01171B00, 0x01171D11, 0x01172C00, 0x01173011, 0x01174000, 0x01180014, 0x01183C00,
    0x0118A010, 0x0118F300, 0x0118FF10, 0x01190000, 0x0119A015, 0x0119A800, 0x0119AA15, 0x0119D800,
    0x0119DA15, 0x0119E500, 0x011A0013, 0x011A4800, 0x011A5013, 0x011A8415, 0x011A8613, 0x011A9D14,
    0x011A9E13, 0x011AA300, 0x011AC010, 0x011AF900, 0x011C0012, 0x011C0900, 0x011C0A12, 0x011C3700,
    0x011C3812, 0x011C4600, 0x011C5012, 0x011C6D00, 0x011C7012, 0x011C9000, 0x011C9212, 0x011CA800,
    0x011CA912, 0x011CB700, 0x011D0013, 0x011D0700, 0x011D0813, 0x011D0A00, 0x011D0B13, 0x011D3700,
    0x011D3A13, 0x011D3B00, 0x011D3C13, 0x011D3E00, 0x011D3F13, 0x011D4800, 0x011D5013, 0x011D5A00,
    0x011D6014, 0x011D6600, 0x011D6714, 0x011D6900, 0x011D6A14, 0x011D8F00, 0x011D9014, 0x011D9200,
    0x011D9314, 0x011D9900, 0x011DA014, 0x011DAA00, 0x011EE014, 0x011EF900, 0x011FC015, 0x011FF200,
    0x011FFF15, 0x01200009, 0x01236F10, 0x01239911, 0x01239A00, 0x01240009, 0x01246310, 0x01246F00,
    0x01247009, 0x01247410, 0x01247500, 0x01248011, 0x01254400, 0x0130000B, 0x01342F00, 0x01343015,
    0x01343900, 0x01440011, 0x01464700, 0x0168000C, 0x016A3900, 0x016A4010, 0x016A5F00, 0x016A6010,
    0x016A6A00, 0x016A6E10, 0x016A7000, 0x016AD010, 0x016AEE00, 0x016AF010, 0x016AF600, 0x016B0010,
    0x016B4600, 0x016B5010, 0x016B5A00, 0x016B5B10, 0x016B6200, 0x016B6310, 0x016B7800, 0x016B7D10,
    0x016B9000, 0x016E4014, 0x016E9B00, 0x016F000D, 0x016F4515, 0x016F4B00, 0x016F4F15, 0x016F500D,
    0x016F7F15, 0x016F8800, 0x016F8F0D, 0x016FA000, 0x016FE012, 0x016FE113, 0x016FE215, 0x016FE400,
    0x01700012, 0x0187ED14, 0x0187F215, 0x0187F800, 0x01880012, 0x018AF300, 0x01B0000C, 0x01B00213,
    0x01B11F00, 0x01B15015, 0x01B15300, 0x01B16415, 0x01B16800, 0x01B17013, 0x01B2FC00, 0x01BC0010,
    0x01BC6B00, 0x01BC7010, 0x01BC7D00, 0x01BC8010, 0x01BC8900, 0x01BC9010, 0x01BC9A00, 0x01BC9C10,
    0x01BCA400, 0x01D00005, 0x01D0F600, 0x01D10005, 0x01D12700, 0x01D1290A, 0x01D12A05, 0x01D1DE11,
    0x01D1E900, 0x01D20008, 0x01D24600, 0x01D2E014, 0x01D2F400, 0x01D30007, 0x01D35700, 0x01D36009,
    0x01D37214, 0x01D37900, 0x01D40005, 0x01D45500, 0x01D45605, 0x01D49D00, 0x01D49E05, 0x01D4A000,
    0x01D4A205, 0x01D4A300, 0x01D4A505, 0x01D4A700, 0x01D4A905, 0x01D4AD00, 0x01D4AE05, 0x01D4BA00,
    0x01D4BB05, 0x01D4BC00, 0x01D4BD05, 0x01D4C107, 0x01D4C205, 0x01D4C400, 0x01D4C505, 0x01D50600,
    0x01D50705, 0x01D50B00, 0x01D50D05, 0x01D51500, 0x01D51605, 0x01D51D00, 0x01D51E05, 0x01D53A00,
    0x01D53B05, 0x01D53F00, 0x01D54005, 0x01D54500, 0x01D54605, 0x01D54700, 0x01D54A05, 0x01D55100,
    0x01D55205, 0x01D6A408, 0x01D6A600, 0x01D6A805, 0x01D7CA09, 0x01D7CC00, 0x01D7CE05, 0x01D80011,
    0x01DA8C00, 0x01DA9B11, 0x01DAA000, 0x01DAA111, 0x01DAB000, 0x01E00012, 0x01E00700, 0x01E00812,
    0x01E01900, 0x01E01B12, 0x01E02200, 0x01E02312, 0x01E02500, 0x01E02612, 0x01E02B00, 0x01E10015,
    0x01E12D00, 0x01E13015, 0x01E13E00, 0x01E14015, 0x01E14A00, 0x01E14E15, 0x01E15000, 0x01E2C015,
    0x01E2FA00, 0x01E2FF15, 0x01E30000, 0x01E80010, 0x01E8C500, 0x01E8C710, 0x01E8D700, 0x01E90012,
    0x01E94B15, 0x01E94C00, 0x01E95012, 0x01E95A00, 0x01E95E12, 0x01E96000, 0x01EC7114, 0x01ECB500,
    0x01ED0115, 0x01ED3E00, 0x01EE000D, 0x01EE0400, 0x01EE050D, 0x01EE2000, 0x01EE210D, 0x01EE2300,
    0x01EE240D, 0x01EE2500, 0x01EE270D, 0x01EE2800, 0x01EE290D, 0x01EE3300, 0x01EE340D, 0x01EE3800,
    0x01EE390D, 0x01EE3A00, 0x01EE3B0D, 0x01EE3C00, 0x01EE420D, 0x01EE4300, 0x01EE470D, 0x01EE4800,
    0x01EE490D, 0x01EE4A00, 0x01EE4B0D, 0x01EE4C00, 0x01EE4D0D, 0x01EE5000, 0x01EE510D, 0x01EE5300,
    0x01EE540D, 0x01EE5500, 0x01EE570D, 0x01EE5800, 0x01EE590D, 0x01EE5A00, 0x01EE5B0D, 0x01EE5C00,
    0x01EE5D0D, 0x01EE5E00, 0x01EE5F0D, 0x01EE6000, 0x01EE610D, 0x01EE6300, 0x01EE640D, 0x01EE6500,
    0x01EE670D, 0x01EE6B00, 0x01EE6C0D, 0x01EE7300, 0x01EE740D, 0x01EE7800, 0x01EE790D, 0x01EE7D00,
    0x01EE7E0D, 0x01EE7F00, 0x01EE800D, 0x01EE8A00, 0x01EE8B0D, 0x01EE9C00, 0x01EEA10D, 0x01EEA400,
    0x01EEA50D, 0x01EEAA00, 0x01EEAB0D, 0x01EEBC00, 0x01EEF00D, 0x01EEF200, 0x01F0000A, 0x01F02C00,
    0x01F0300A, 0x01F09400, 0x01F0A00C, 0x01F0AF00, 0x01F0B10C, 0x01F0BF10, 0x01F0C000, 0x01F0C10C,
    0x01F0D000, 0x01F0D10C, 0x01F0E010, 0x01F0F600, 0x01F1000B, 0x01F10B10, 0x01F10D00, 0x01F1100B,
    0x01F12F14, 0x01F1300C, 0x01F1310B, 0x01F1320C, 0x01F13D0B, 0x01F13E0C, 0x01F13F0B, 0x01F1400C,
    0x01F1420B, 0x01F1430C, 0x01F1460B, 0x01F1470C, 0x01F14A0B, 0x01F14F0C, 0x01F1570B, 0x01F1580C,
    0x01F15F0B, 0x01F1600C, 0x01F16A0D, 0x01F16C15, 0x01F16D00, 0x01F1700C, 0x01F1790B, 0x01F17A0C,
    0x01F17B0B, 0x01F17D0C, 0x01F17F0B, 0x01F1800C, 0x01F18A0B, 0x01F18E0C, 0x01F1900B, 0x01F1910C,
    0x01F19B12, 0x01F1AD00, 0x01F1E60C, 0x01F2000B, 0x01F2010C, 0x01F20300, 0x01F2100B, 0x01F2320C,
    0x01F23B12, 0x01F23C00, 0x01F2400B, 0x01F24900, 0x01F2500C, 0x01F25200, 0x01F26013, 0x01F26600,
    0x01F3000C, 0x01F32110, 0x01F32D11, 0x01F3300C, 0x01F33610, 0x01F3370C, 0x01F37D10, 0x01F37E11,
    0x01F3800C, 0x01F39410, 0x01F3A00C, 0x01F3C510, 0x01F3C60C, 0x01F3CB10, 0x01F3CF11, 0x01F3D410,
    0x01F3E00C, 0x01F3F110, 0x01F3F811, 0x01F4000C, 0x01F43F10, 0x01F4400C, 0x01F44110, 0x01F4420C,
    0x01F4F810, 0x01F4F90C, 0x01F4FD10, 0x01F4FF11, 0x01F5000C, 0x01F53E10, 0x01F5400D, 0x01F54410,
    0x01F54B11, 0x01F5500C, 0x01F56810, 0x01F57A12, 0x01F57B10, 0x01F5A412, 0x01F5A510, 0x01F5FB0C,
    0x01F6000D, 0x01F6010C, 0x01F6110D, 0x01F6120C, 0x01F6150D, 0x01F6160C, 0x01F6170D, 0x01F6180C,
    0x01F6190D, 0x01F61A0C, 0x01F61B0D, 0x01F61C0C, 0x01F61F0D, 0x01F6200C, 0x01F6260D, 0x01F6280C,
    0x01F62C0D, 0x01F62D0C, 0x01F62E0D, 0x01F6300C, 0x01F6340D, 0x01F6350C, 0x01F64110, 0x01F64311,
    0x01F6450C, 0x01F65010, 0x01F6800C, 0x01F6C610, 0x01F6D011, 0x01F6D112, 0x01F6D313, 0x01F6D515,
    0x01F6D600, 0x01F6E010, 0x01F6ED00, 0x01F6F010, 0x01F6F412, 0x01F6F713, 0x01F6F914, 0x01F6FA15,
    0x01F6FB00, 0x01F7000C, 0x01F77400, 0x01F78010, 0x01F7D514, 0x01F7D900, 0x01F7E015, 0x01F7EC00,
    0x01F80010, 0x01F80C00, 0x01F81010, 0x01F84800, 0x01F85010, 0x01F85A00, 0x01F86010, 0x01F88800,
    0x01F89010, 0x01F8AE00, 0x01F90013, 0x01F90C00, 0x01F90D15, 0x01F91011, 0x01F91912, 0x01F91F13,
    0x01F92012, 0x01F92813, 0x01F93012, 0x01F93113, 0x01F93312, 0x01F93F15, 0x01F94012, 0x01F94C13,
    0x01F94D14, 0x01F95012, 0x01F95F13, 0x01F96C14, 0x01F97115, 0x01F97200, 0x01F97314, 0x01F97700,
    0x01F97A14, 0x01F97B15, 0x01F97C14, 0x01F98011, 0x01F98512, 0x01F99213, 0x01F99814, 0x01F9A300,
    0x01F9A515, 0x01F9AB00, 0x01F9AE15, 0x01F9B014, 0x01F9BA15, 0x01F9C011, 0x01F9C114, 0x01F9C315,
    0x01F9CB00, 0x01F9CD15, 0x01F9D013, 0x01F9E714, 0x01FA0015, 0x01FA5400, 0x01FA6014, 0x01FA6E00,
    0x01FA7015, 0x01FA7400, 0x01FA7815, 0x01FA7B00, 0x01FA8015, 0x01FA8300, 0x01FA9015, 0x01FA9600,
    0x02000005, 0x02000200, 0x02006205, 0x02006300, 0x02006405, 0x02006500, 0x0200E005, 0x0200E100,
    0x0200E205, 0x0200E300, 0x02011F05, 0x02012000, 0x02012105, 0x02012200, 0x02092805, 0x02092900,
    0x02092A05, 0x02092B00, 0x02098105, 0x02098200, 0x02098305, 0x02098400, 0x02098A05, 0x02098B00,
    0x02098C05, 0x02098D00, 0x02099A05, 0x02099B00, 0x02099C05, 0x02099D00, 0x020AE805, 0x020AE900,
    0x020AEA05, 0x020AEB00, 0x020AFB05, 0x020AFC00, 0x020AFD05, 0x020AFE00, 0x020B1705, 0x020B1800,
    0x020B1905, 0x020B1A00, 0x02238E05, 0x02238F00, 0x02239005, 0x02239100, 0x02299605, 0x02299700,
    0x02299805, 0x02299900, 0x023B1905, 0x023B1A00, 0x023B1B05, 0x023B1C00, 0x02626B05, 0x02626C00,
    0x02626D05, 0x02626E00, 0x02A6D505, 0x02A6D600, 0x02B7330B, 0x02B73400, 0x02B81C0C, 0x02B81D00,
    0x02CEA011, 0x02CEA100, 0x02EBDF13, 0x02EBE000, 0x02F80005, 0x02FA1E00, 0x0E000105, 0x0E000200,
    0x0E002005, 0x0E008000, 0x0E010007, 0x0E01F000, 0x0FFFFC02, 0x0FFFFD00, 0x10FFFC02, 0x10FFFD00,
    0xFFFFFFFF};
enum class category {
    c,
    other = c,
    cc,
    control = cc,
    cf,
    format = cf,
    cn,
    unassigned = cn,
    co,
    private_use = co,
    cs,
    surrogate = cs,
    l,
    letter = l,
    lc,
    cased_letter = lc,
    ll,
    lowercase_letter = ll,
    lm,
    modifier_letter = lm,
    lo,
    other_letter = lo,
    lt,
    titlecase_letter = lt,
    lu,
    uppercase_letter = lu,
    m,
    mark = m,
    mc,
    spacing_mark = mc,
    me,
    enclosing_mark = me,
    mn,
    nonspacing_mark = mn,
    n,
    number = n,
    nd,
    decimal_number = nd,
    nl,
    letter_number = nl,
    no,
    other_number = no,
    p,
    punctuation = p,
    pc,
    connector_punctuation = pc,
    pd,
    dash_punctuation = pd,
    pe,
    close_punctuation = pe,
    pf,
    final_punctuation = pf,
    pi,
    initial_punctuation = pi,
    po,
    other_punctuation = po,
    ps,
    open_punctuation = ps,
    s,
    symbol = s,
    sc,
    currency_symbol = sc,
    sk,
    modifier_symbol = sk,
    sm,
    math_symbol = sm,
    so,
    other_symbol = so,
    z,
    separator = z,
    zl,
    line_separator = zl,
    zp,
    paragraph_separator = zp,
    zs,
    space_separator = zs,
    __max
};
static constexpr const std::array __categories_names = {
    __string_with_idx{"c", 0},
    __string_with_idx{"cased_letter", 7},
    __string_with_idx{"cc", 1},
    __string_with_idx{"cf", 2},
    __string_with_idx{"close_punctuation", 24},
    __string_with_idx{"cn", 3},
    __string_with_idx{"co", 4},
    __string_with_idx{"connector_punctuation", 22},
    __string_with_idx{"control", 1},
    __string_with_idx{"cs", 5},
    __string_with_idx{"currency_symbol", 30},
    __string_with_idx{"dash_punctuation", 23},
    __string_with_idx{"decimal_number", 18},
    __string_with_idx{"enclosing_mark", 15},
    __string_with_idx{"final_punctuation", 25},
    __string_with_idx{"format", 2},
    __string_with_idx{"initial_punctuation", 26},
    __string_with_idx{"l", 6},
    __string_with_idx{"lc", 7},
    __string_with_idx{"letter", 6},
    __string_with_idx{"letter_number", 19},
    __string_with_idx{"line_separator", 35},
    __string_with_idx{"ll", 8},
    __string_with_idx{"lm", 9},
    __string_with_idx{"lo", 10},
    __string_with_idx{"lowercase_letter", 8},
    __string_with_idx{"lt", 11},
    __string_with_idx{"lu", 12},
    __string_with_idx{"m", 13},
    __string_with_idx{"mark", 13},
    __string_with_idx{"math_symbol", 32},
    __string_with_idx{"mc", 14},
    __string_with_idx{"me", 15},
    __string_with_idx{"mn", 16},
    __string_with_idx{"modifier_letter", 9},
    __string_with_idx{"modifier_symbol", 31},
    __string_with_idx{"n", 17},
    __string_with_idx{"nd", 18},
    __string_with_idx{"nl", 19},
    __string_with_idx{"no", 20},
    __string_with_idx{"nonspacing_mark", 16},
    __string_with_idx{"number", 17},
    __string_with_idx{"open_punctuation", 28},
    __string_with_idx{"other", 0},
    __string_with_idx{"other_letter", 10},
    __string_with_idx{"other_number", 20},
    __string_with_idx{"other_punctuation", 27},
    __string_with_idx{"other_symbol", 33},
    __string_with_idx{"p", 21},
    __string_with_idx{"paragraph_separator", 36},
    __string_with_idx{"pc", 22},
    __string_with_idx{"pd", 23},
    __string_with_idx{"pe", 24},
    __string_with_idx{"pf", 25},
    __string_with_idx{"pi", 26},
    __string_with_idx{"po", 27},
    __string_with_idx{"private_use", 4},
    __string_with_idx{"ps", 28},
    __string_with_idx{"punctuation", 21},
    __string_with_idx{"s", 29},
    __string_with_idx{"sc", 30},
    __string_with_idx{"separator", 34},
    __string_with_idx{"sk", 31},
    __string_with_idx{"sm", 32},
    __string_with_idx{"so", 33},
    __string_with_idx{"space_separator", 37},
    __string_with_idx{"spacing_mark", 14},
    __string_with_idx{"surrogate", 5},
    __string_with_idx{"symbol", 29},
    __string_with_idx{"titlecase_letter", 11},
    __string_with_idx{"unassigned", 3},
    __string_with_idx{"uppercase_letter", 12},
    __string_with_idx{"z", 34},
    __string_with_idx{"zl", 35},
    __string_with_idx{"zp", 36},
    __string_with_idx{"zs", 37}};
static constexpr __range_array __cat_cc = {0x00000001, 0x00002000, 0x00007F01, 0x0000A000};
static constexpr __range_array __cat_zs = {
    0x00000000, 0x00002001, 0x00002100, 0x0000A001, 0x0000A100, 0x00168001, 0x00168100, 0x00200001,
    0x00200B00, 0x00202F01, 0x00203000, 0x00205F01, 0x00206000, 0x00300001, 0x00300100};
static constexpr __bool_trie<32, 991, 1, 0, 51, 255, 1, 0, 482, 4, 26, 39> __cat_po{
    {0x8c00d4ee00000000, 0x0000000010000001, 0x80c0008200000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x4000000000000000, 0x0000000000000080, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x00000000fc000000, 0x0000000000000200, 0x0018000000000049,
     0x00000000c8003600, 0x00003c0000000000, 0x0000000000000000, 0x0000000000100000,
     0x0000000000003fff, 0x0000000000000000, 0x0000000000000000, 0x0380000000000000},
    {1,  2,  2,  2,  3,  2,  4,  2,  5,  2,  6, 2, 2,  2,  2, 2,  7, 8,  2,  2,  2,  2,  9, 2,  10,
     2,  2,  11, 2,  12, 13, 2,  14, 2,  15, 2, 2, 2,  2,  2, 2,  2, 2,  2,  16, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  17, 2,  18, 19, 2, 2, 20, 21, 2, 2,  2, 2,  22, 2,  2,  23, 2, 24, 2,
     2,  25, 2,  26, 27, 28, 2,  29, 2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  30, 31, 2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  32, 2, 6,  2,
     2,  33, 34, 2,  2,  2,  2,  2,  2,  35, 2, 2, 15, 2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  28, 2,  2,  2,  2,  36, 37, 2,  38, 2, 2, 2,  2,  2, 39, 2, 40, 41, 42, 2,  43, 2, 44, 2,
     45, 2,  2,  2,  46, 2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 2, 2,  2,  2, 2,  2, 2,  2,  2,  2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  47, 48, 2, 2, 49, 50, 2, 2},
    {0x7fff000000000000, 0x0000000040000000, 0x0000000000000000, 0x0001003000000000,
     0x2000000000000000, 0x0040000000000000, 0x0001000000000000, 0x0080000000000000,
     0x0000000000000010, 0x0010000000000000, 0x000000000c008000, 0x000000000017fff0,
     0x0000000000000020, 0x00000000061f0000, 0x000000000000fc00, 0x0800000000000000,
     0x000001ff00000000, 0x0000400000000000, 0x0000380000000000, 0x0060000000000000,
     0x0000000007700000, 0x00000000000007bf, 0x0000000000000030, 0x00000000c0000000,
     0x00003f7f00000000, 0x00000001fc000000, 0xf000000000000000, 0xf800000000000000,
     0xc000000000000000, 0x00000000000800ff, 0x79ff00ff00c00000, 0x000000007febff8e,
     0xde00000000000000, 0xf3ff7c00cb7fc9c3, 0x000000000000fffa, 0x200000000000000e,
     0x000000000000e000, 0x4008000000000000, 0x00fc000000000000, 0x00f0000000000000,
     0x170000000000c000, 0x0000c00000000000, 0x0000000080000000, 0x00000000c0003ffe,
     0x00000000f0000000, 0x00030000c0000000, 0x0000080000000000, 0x00010000027f0000,
     0x00000d0380f71e60, 0x100000018c00d4ee, 0x0000003200000000},
    {1, 2, 3, 3, 3, 4, 3, 3, 3, 3, 5, 3, 6, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
    {1,  0,  0,  0, 0,  0, 0, 0,  0,  0,  2,  3,  0,  0,  0, 0,  0,  4,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 5,  0, 0, 6,  0,  0,  0,  0,  7,  0,  8, 9,  0,  10, 0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 11, 0,  0,  0,  12, 13, 14, 0, 15, 0,  16, 17, 0,  18, 0,  0,  0,  0,
     0,  0,  19, 0, 20, 0, 0, 0,  21, 0,  22, 0,  0,  23, 0, 0,  0,  24, 0,  0,  0,  0,  0,  0,  25,
     26, 27, 28, 0, 0,  0, 0, 0,  0,  29, 0,  0,  0,  0,  0, 0,  0,  0,  0,  30, 0,  0,  0,  26, 0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  31, 0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  32, 0,  33, 34, 35, 0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  36, 0,  0,  0,  0, 25, 0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  2,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  37, 0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0, 0,  0, 38},
    {0x0000000000000000, 0x0000000000000007, 0x0000000080000000, 0x0000000000010000,
     0x0000800000000000, 0x0000000000800000, 0x8000000080000000, 0x8000000001ff0000,
     0x007f000000000000, 0xfe00000000000000, 0x000000001e000000, 0x0000000003e00000,
     0x0000000000003f80, 0xd800000000000000, 0x0000000000000003, 0x003000000000000f,
     0x00000000e80021e0, 0x3f00000000000000, 0x0000020000000000, 0x000000002800f800,
     0x0000000000000040, 0x0000000000fffffe, 0x00001fff0000000e, 0x7000000000000000,
     0x0800000000000000, 0x0000000400000000, 0x8000000000000000, 0x000000000000007f,
     0x00000007dc000000, 0x000300000000003e, 0x0180000000000000, 0x001f000000000000,
     0x0000c00000000000, 0x0020000000000000, 0x0f80000000000000, 0x0000000000000010,
     0x0000000007800000, 0x0000000000000f80, 0x00000000c0000000}};
static constexpr __range_array __cat_sc = {
    0x00000000, 0x00002401, 0x00002500, 0x0000A201, 0x0000A600, 0x00058F01, 0x00059000, 0x00060B01,
    0x00060C00, 0x0007FE01, 0x00080000, 0x0009F201, 0x0009F400, 0x0009FB01, 0x0009FC00, 0x000AF101,
    0x000AF200, 0x000BF901, 0x000BFA00, 0x000E3F01, 0x000E4000, 0x0017DB01, 0x0017DC00, 0x0020A001,
    0x0020C000, 0x00A83801, 0x00A83900, 0x00FDFC01, 0x00FDFD00, 0x00FE6901, 0x00FE6A00, 0x00FF0401,
    0x00FF0500, 0x00FFE001, 0x00FFE200, 0x00FFE501, 0x00FFE700, 0x011FDD01, 0x011FE100, 0x01E2FF01,
    0x01E30000, 0x01ECB001, 0x01ECB100};
static constexpr __bool_trie<32, 962, 28, 2, 19, 0, 0, 0, 0, 0, 0, 0> __cat_ps{
    {0x0000010000000000, 0x0800000008000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  2, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  3, 4, 5, 0, 0, 0, 0,  0, 0, 0, 0,  0, 6, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  7, 0, 8, 0, 0, 0, 0,  0, 0, 9, 10, 0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,
     0,  0, 0, 0,  0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 14, 0, 0, 0, 15,
     16, 0, 0, 17, 18},
    {0x0000000000000000, 0x1400000000000000, 0x0000000008000000, 0x0000000044000000,
     0x2000000000000020, 0x0000000000002000, 0x0000020000000500, 0x0015550000000000,
     0x0000554000000020, 0x0000000000aaaaa8, 0x1000000005000000, 0x0000015400000000,
     0x0000000000000004, 0x0000000025515500, 0x8000000000000000, 0xaaa0000000800000,
     0x000000002a00008a, 0x0800000000000100, 0x0000000488000000},
    {},
    {},
    {}};
static constexpr __bool_trie<32, 962, 28, 2, 17, 0, 0, 0, 0, 0, 0, 0> __cat_pe{
    {0x0000020000000000, 0x2000000020000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     2,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 3, 4, 0, 0,  0, 0, 0, 0, 0, 0, 0, 5, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 6, 0, 7, 0, 0, 0,  0, 0, 0, 8, 9, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0,  0,  0, 0,
     0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 14, 0, 0,
     15, 16},
    {0x0000000000000000, 0x2800000000000000, 0x0000000010000000, 0x4000000000000040,
     0x0000000000004000, 0x0000040000000a00, 0x002aaa0000000000, 0x0000aa8000000040,
     0x0000000001555550, 0x200000000a000000, 0x000002a800000000, 0x00000000caa2aa00,
     0x4000000000000000, 0x5540000001000000, 0x0000000054000115, 0x2000000000000200,
     0x0000000920000000},
    {},
    {},
    {}};
static constexpr __bool_trie<32, 895, 97, 0, 25, 2, 13, 241, 97, 91, 4, 7> __cat_sm{
    {0x7000080000000000, 0x5000000000000000, 0x0002100000000000, 0x0080000000800000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x00000000000001c0, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1,  2,  0, 3,  4, 5, 6, 7, 7, 7, 7,  8,  9, 10, 11, 0, 0,  0,  0, 0, 0, 12, 13, 0, 14, 0, 0,
     0,  0,  0, 15, 0, 0, 0, 0, 7, 7, 16, 17, 7, 7,  7,  7, 18, 19, 0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0, 0, 0, 0, 0, 0,  20, 0, 0,  0,  0, 0,  0,  0, 0, 0, 0,  0,  0, 21, 0, 0,
     22, 23, 0, 24},
    {0x0000000000000000, 0x1c00000000040010, 0x0000000000001c00, 0x0000000001000000,
     0x000000000000081f, 0x000040490c1f0000, 0xfff000000014c000, 0xffffffffffffffff,
     0x0000000300000000, 0x1000000000000000, 0x000ffffff8000000, 0x00000003f0000000,
     0x0080000000000000, 0xff00000000000002, 0x0000800000000000, 0xffff003fffffff9f,
     0xfffffffffe000007, 0xcffffffff0ffffff, 0xffff000000000000, 0x0000000000001f9f,
     0x0000020000000000, 0x0000007400000000, 0x0000000070000800, 0x0000000050000000,
     0x00001e0400000000},
    {1, 2},
    {1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6},
    {0x0000000000000000, 0x0800000008000002, 0x0020000000200000, 0x0000800000008000,
     0x0000020000000200, 0x0000000000000008, 0x0003000000000000}};
static constexpr flat_array<24> __cat_pd{{0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2010,
                                          0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2E17,
                                          0x2E1A, 0x2E3A, 0x2E3B, 0x2E40, 0x301C, 0x3030,
                                          0x30A0, 0xFE31, 0xFE32, 0xFE58, 0xFE63, 0xFF0D}};
static constexpr __bool_trie<32, 984, 5, 3, 9, 255, 1, 0, 340, 18, 26, 8> __cat_nd{
    {0x03ff000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x000003ff00000000, 0x0000000000000000, 0x03ff000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000000003ff},
    {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 2, 3, 0, 0, 0, 0, 4, 2, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0,
     5, 0, 2, 0, 0, 6, 0, 0, 2, 7, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4,
     0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
    {0x0000000000000000, 0x0000ffc000000000, 0x0000000003ff0000, 0x000003ff00000000,
     0x00000000000003ff, 0x000000000000ffc0, 0x0000000003ff03ff, 0x03ff000000000000,
     0x03ff000003ff0000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 4, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0,
     0, 5, 0, 5, 0, 0, 0, 0, 0, 5, 0, 6, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 5, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
     0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0,
     0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5},
    {0x0000000000000000, 0x000003ff00000000, 0x03ff000000000000, 0x0000ffc000000000,
     0xffc0000000000000, 0x0000000003ff0000, 0x00000000000003ff, 0xffffffffffffc000}};
static constexpr __bool_trie<32, 955, 34, 3, 24, 255, 1, 0, 341, 16, 27, 24> __cat_lu{
    {0x0000000000000000, 0x0000000007fffffe, 0x0000000000000000, 0x000000007f7fffff,
     0xaa55555555555555, 0x2b555555555554aa, 0x11aed2d5b1dbced6, 0x55d255554aaaa490,
     0x6c05555555555555, 0x000000000000557a, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x8045000000000000, 0x00000ffbfffed740, 0xe6905555551c8000,
     0x0000ffffffffffff, 0x5555555500000000, 0x5555555555555401, 0x5555555555552aab,
     0xfffe555555555555, 0x00000000007fffff, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1, 2,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  1,  3, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 4, 0, 0, 0, 0, 0, 5,  5,
     6, 5,  7, 8, 9, 10, 0, 0, 0, 0, 11, 12, 13, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 14, 15,
     5, 16, 0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  17, 18, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,  0,
     0, 0,  23},
    {0x0000000000000000, 0xffffffff00000000, 0x00000000000020bf, 0x003fffffffffffff,
     0xe7ffffffffff0000, 0x5555555555555555, 0x5555555540155555, 0xff00ff003f00ff00,
     0x0000ff00aa003f00, 0x0f00000000000000, 0x0f001f000f000f00, 0xc00f3d503e273884,
     0x0000000000000020, 0x0000000000000008, 0x00007fffffffffff, 0xc025ea9d00000000,
     0x0004280555555555, 0x0000155555555555, 0x0000000005555555, 0x5554555400000000,
     0x6a00555555555555, 0x555f7d5555452855, 0x0000000000000074, 0x07fffffe00000000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1,  0,  2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  5,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
     21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23},
    {0x0000000000000000, 0x000000ffffffffff, 0xffff000000000000, 0x00000000000fffff,
     0x0007ffffffffffff, 0xffffffff00000000, 0x00000000ffffffff, 0xfff0000003ffffff,
     0xffffff0000003fff, 0x003fde64d0000003, 0x000003ffffff0000, 0x7b0000001fdfe7b0,
     0xfffff0000001fc5f, 0x03ffffff0000003f, 0x00003ffffff00000, 0xf0000003ffffff00,
     0xffff0000003fffff, 0xffffff00000003ff, 0x07fffffc00000001, 0x001ffffff0000000,
     0x00007fffffc00000, 0x000001ffffff0000, 0x0000000000000400, 0x00000003ffffffff}};
static constexpr __bool_trie<32, 898, 94, 0, 12, 1, 15, 240, 1, 79, 48, 2> __cat_sk{
    {0x0000000000000000, 0x0000000140000000, 0x0110810000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xffffafe0fffc003c,
     0x0000000000000000, 0x0020000000000000, 0x0000000000000030, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 11},
    {0x0000000000000000, 0xa000000000000000, 0x6000e000e000e003, 0x0000000018000000,
     0x00000003007fffff, 0x0000000000000600, 0x0000000008000000, 0xfffc000000000000,
     0x0000000000000003, 0x4000000000000000, 0x0000000000000001, 0x0000000800000000},
    {1},
    {1},
    {0x0000000000000000, 0xf800000000000000}};
static constexpr flat_array<10> __cat_pc{
    {0x005F, 0x203F, 0x2040, 0x2054, 0xFE33, 0xFE34, 0xFE4D, 0xFE4E, 0xFE4F, 0xFF3F}};
static constexpr __bool_trie<32, 955, 35, 2, 30, 255, 1, 0, 342, 16, 26, 25> __cat_ll{
    {0x0000000000000000, 0x07fffffe00000000, 0x0020000000000000, 0xff7fffff80000000,
     0x55aaaaaaaaaaaaaa, 0xd4aaaaaaaaaaab55, 0xe6512d2a4e243129, 0xaa29aaaab5555240,
     0x93faaaaaaaaaaaaa, 0xffffffffffffaa85, 0x0000ffffffefffff, 0x0000000000000000,
     0x0000000000000000, 0x388a000000000000, 0xfffff00000010000, 0x192faaaaaae37fff,
     0xffff000000000000, 0xaaaaaaaaffffffff, 0xaaaaaaaaaaaaa802, 0xaaaaaaaaaaaad554,
     0x0000aaaaaaaaaaaa, 0xffffffff00000000, 0x00000000000001ff, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 2, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  3,  0, 4, 5, 6,
     0,  7,  7, 8,  7,  9,  10, 11, 12, 0,  0, 0, 0, 13, 14, 15, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  16, 17, 7,  18, 19, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     20, 21, 0, 22, 23, 24, 25, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 16, 26, 27, 0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 0, 0,
     0,  28, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0, 0, 29},
    {0x0000000000000000, 0xe7ffffffffff0000, 0x3f00000000000000, 0x00000000000001ff,
     0x00000fffffffffff, 0xfefff80000000000, 0x0000000007ffffff, 0xaaaaaaaaaaaaaaaa,
     0xaaaaaaaabfeaaaaa, 0x00ff00ff003f00ff, 0x3fff00ff00ff003f, 0x40df00ff00ff00ff,
     0x00dc00ff00cf00dc, 0x321080000008c400, 0x00000000000043c0, 0x0000000000000010,
     0xffff000000000000, 0x0fda15627fffffff, 0x0008501aaaaaaaaa, 0x000020bfffffffff,
     0x00002aaaaaaaaaaa, 0x000000000aaaaaaa, 0xaaabaaa800000000, 0x95feaaaaaaaaaaaa,
     0xaaa082aaaaba50aa, 0x0400000000000008, 0xffff00ff07ffffff, 0xffffffffffffffff,
     0x0000000000f8007f, 0x0000000007fffffe},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1,  2,  0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
     21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24},
    {0x0000000000000000, 0xffffff0000000000, 0x000000000000ffff, 0x0fffffffff000000,
     0x0007ffffffffffff, 0x00000000ffffffff, 0xffffffff00000000, 0x000ffffffc000000,
     0x000000ffffdfc000, 0xebc000000ffffffc, 0xfffffc000000ffef, 0x00ffffffc000000f,
     0x00000ffffffc0000, 0xfc000000ffffffc0, 0xffffc000000fffff, 0x0ffffffc000000ff,
     0x0000ffffffc00000, 0x0000003ffffffc00, 0xf0000003f7fffffc, 0xffc000000fdfffff,
     0xffff0000003f7fff, 0xfffffc000000fdff, 0x0000000000000bf7, 0xfffffffc00000000,
     0x000000000000000f}};
static constexpr __bool_trie<32, 985, 7, 0, 53, 255, 1, 0, 487, 4, 21, 48> __cat_so{
    {0x0000000000000000, 0x0000000000000000, 0x0001424000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000004, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000006000, 0x0000000000000000,
     0x000000000000c000, 0x0000000000000000, 0x0000000000000000, 0x6000020040000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0040000000000000},
    {1,  0,  0,  0,  0,  0,  2,  0,  3,  0,  4,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  6,  0,  7,
     8,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  10, 0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  11, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  12, 0,  13, 0,  0,  0,  0,  0,  14, 0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  15, 16, 17,
     18, 0,  0,  0,  0,  19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29, 27, 30, 27, 27, 27, 31, 32,
     0,  27, 27, 27, 27, 0,  0,  0,  0,  0,  0,  0,  0,  33, 34, 35, 27, 0,  0,  0,  36, 0,  0,  0,
     0,  0,  0,  37, 38, 27, 27, 27, 39, 40, 0,  0,  0,  0,  0,  41, 42, 43, 44, 45, 46, 27, 27, 27,
     27, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  27, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  47, 48, 0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  49, 0,  0,  0,  0,  0,  0,  0,  0,  50, 0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  51, 0,  0,  0,  0,  0,  0,  0,
     52},
    {0x0000000000000000, 0x0400000000000000, 0x0001000000000000, 0x05f8000000000000,
     0x8000000000000000, 0x0200000000008000, 0x01500000fce8000e, 0xc000000000000000,
     0x0000000001e0dfbf, 0x00000000c0000000, 0x0000000003ff0000, 0x0000200000000000,
     0x0000000000000001, 0xffffffffc0000000, 0x1ff007fe00000000, 0x0c0042afc0d0037b,
     0x000000000000b400, 0xffffbfb6f3e00c00, 0x000fffffffeb3fff, 0xfffff9fcfffff0ff,
     0xefffffffffffffff, 0xfff0000007ffffff, 0xfffffffc0fffffff, 0x0000007fffffffff,
     0x00000000000007ff, 0xfffffffff0000000, 0x000003ffffffffff, 0xffffffffffffffff,
     0xff7fffffffffffff, 0x00fffffffffffffd, 0xffff7fffffffffff, 0x000000ffffffffff,
     0xfffffffffff00000, 0x0000ffffffffffff, 0xffcfffffffffe060, 0xffffffffff3fffff,
     0x000007e000000000, 0xfffffffffbffffff, 0x000fffffffffffff, 0x0fff0000003fffff,
     0xc0c00001000c0010, 0x00000000ffc30000, 0x0000000fffffffff, 0xfffffc007fffffff,
     0xffffffff000100ff, 0x0001fffffffffc00, 0x7fffffffffffffff, 0xffffffffffff0000,
     0x000000000000007f, 0x02c00f0000000000, 0x0380000000000000, 0x2000000000000000,
     0x3000611000000000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 4, 2, 5, 6, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1,  2,  3,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  10, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  11, 0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  12, 12, 12, 13, 14, 15, 16, 17, 12, 18, 0,  0,  12, 19, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  12, 12, 12, 12, 12, 12, 12, 12, 20, 21, 22, 0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  23, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  24, 0,
     25, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  26, 12, 27, 28, 29, 30, 31, 32, 33, 34, 0,  0,
     12, 12, 12, 35, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 36, 12, 37, 12, 38, 39, 40, 41, 0,
     42, 43, 44, 45, 12, 46, 47},
    {0x0000000000000000, 0xff80000000000000, 0xfe00000000000000, 0x000000010fff73ff,
     0x1fffffffffff0000, 0x0180000000000000, 0x0000000000000100, 0x8000000000000000,
     0x0003fffe1fe00000, 0xf000000000000000, 0x0000000000000020, 0x0000000010000000,
     0xffffffffffffffff, 0x003fffffffffffff, 0xfffffe7fffffffff, 0x00001c1fffffffff,
     0xffffc3fffffff018, 0x000001ffffffffff, 0x0000000000000023, 0x00000000007fffff,
     0x0780000000000000, 0xffdfe00000000000, 0x000000000000006f, 0x0000000000008000,
     0x0000100000000000, 0x0000400000000000, 0xffff0fffffffffff, 0xfffe7fff000fffff,
     0x003ffffffffefffe, 0xffffffffffff0000, 0xffff1fffffffffff, 0x00001fffffffffff,
     0xffffffc000000000, 0x0fffffffffff0007, 0x0000003f000301ff, 0x07ffffffffffffff,
     0x07ff1fff003fffff, 0x000fffffffffffff, 0x00000fff01ffffff, 0xffffffffffff0fff,
     0xffffffff03ff00ff, 0x00003fffffff00ff, 0xffffffffffffefff, 0xfc7bffffffffffff,
     0xffffc7e7ffffffff, 0xffffffffffffe7ff, 0x070f3fff000fffff, 0x00000000003f0007}};
static constexpr __bool_trie<32, 991, 1, 0, 145, 255, 1, 0, 1279, 1, 0, 104> __cat_lo{
    {0x0000000000000000, 0x0000000000000000, 0x0400040000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0800000000000000, 0x000000000000000f,
     0x0000000000000000, 0x0000000000000000, 0x0000000000100000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x000787ffffff0000,
     0xffffffff00000000, 0xfffec000000007fe, 0xffffffffffffffff, 0x9c00c000002fffff,
     0x0000fffffffd0000, 0xffffffffffffe000, 0x0002003fffffffff, 0x000007fffffffc00},
    {1,   2,   3,   4,   5,   6,   7,  8,  9,   10, 11,  12,  13,  14,  15,  16,  17,  18,  19,
     20,  21,  22,  23,  24,  25,  26, 27, 28,  29, 30,  3,   31,  32,  33,  3,   34,  34,  34,
     34,  34,  35,  36,  37,  38,  39, 40, 3,   41, 34,  34,  34,  34,  34,  34,  34,  34,  42,
     43,  44,  45,  46,  47,  48,  49, 50, 51,  52, 53,  54,  55,  56,  57,  58,  3,   3,   59,
     60,  61,  62,  63,  64,  3,   65, 3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   66,  3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   67,  68,  69,  70,  3,
     3,   3,   3,   3,   3,   3,   3,  71, 41,  72, 73,  74,  34,  75,  67,  3,   3,   3,   3,
     3,   3,   3,   3,   76,  3,   77, 3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   78,  3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   79,  3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   80,  3,   81,  82,  83,  84,  79,  85,
     3,   3,   3,   3,   3,   3,   86, 87, 3,   3,  3,   3,   3,   3,   88,  89,  88,  90,  3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  91,  3,   3,   3,   3,   3,   3,   3,   92,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   93,  3,   94,  95,  3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   96,  3,   97,  3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   98,  3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   99,  3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   100, 3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   96,  3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   99, 3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   101, 3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   102, 3,   85,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   103, 104, 3,
     105, 3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   106, 107, 108,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  109, 110,
     34,  34,  34,  34,  111, 112, 49, 62, 3,   3,  113, 114, 115, 47,  116, 117, 118, 119, 120,
     121, 122, 123, 124, 125, 126, 3,  3,  127, 34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34, 34, 34,  34, 34,  34,  128, 129, 3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,  3,  3,   3,  3,   3,   3,   34,  34,  34,  34,  34,  130,
     34,  131, 132, 133, 134, 135, 34, 34, 34,  34, 136, 137, 138, 139, 3,   140, 34,  141, 3,
     142, 143, 144},
    {0x00000000003fffff, 0x000007ff01ffffff, 0x3fdfffff00000000, 0x0000000000000000,
     0x23fffffffffffff0, 0xfffc0003ff010000, 0x23c5fdfffff99fe1, 0x10030003b0004000,
     0x036dfdfffff987e0, 0x001c00005e000000, 0x23edfdfffffbbfe0, 0x0200000300010000,
     0x23edfdfffff99fe0, 0x00020003b0000000, 0x03ffc718d63dc7e8, 0x0000000000010000,
     0x23fffdfffffddfe0, 0x0000000307000000, 0x23effdfffffddfe1, 0x0006000340000000,
     0x27fffffffffddfe0, 0xfc00000380704000, 0x2ffbfffffc7fffe0, 0x000000000000007f,
     0x000dfffffffffffe, 0x000000000000003f, 0x200dffaffffff7d6, 0x00000000f000001f,
     0x0000000000000001, 0x00001ffffffffeff, 0x0000000000001f00, 0x800007ffffffffff,
     0xffe1c0623c3f0000, 0x0000000000004003, 0xffffffffffffffff, 0xffffffff3d7f3dff,
     0x7f3dffffffff3dff, 0xffffffffff7fff3d, 0xffffffffff3dffff, 0x0000000007ffffff,
     0x000000000000ffff, 0xfffffffffffffffe, 0xffff9fffffffffff, 0xffffffff07fffffe,
     0x01fe07ffffffffff, 0x0003ffff0003dfff, 0x0001dfff0003ffff, 0x000fffffffffffff,
     0x0000000010000000, 0xffffffff00000000, 0x01fffffffffffff7, 0xffff05ffffffff9f,
     0x003fffffffffffff, 0x000000007fffffff, 0x001f3fffffff0000, 0xffff0fffffffffff,
     0x00000000000003ff, 0xffffffff007fffff, 0x00000000001fffff, 0x000fffffffffffe0,
     0x0000000000000fe0, 0xfc00c001fffffff8, 0x0000003fffffffff, 0x0000000fffffffff,
     0x00fffffffc00e000, 0x046fde0000000000, 0x01e0000000000000, 0xffff000000000000,
     0x000000ffffffffff, 0x7f7f7f7f007fffff, 0x000000007f7f7f7f, 0x1000000000000040,
     0xfffffffe807fffff, 0x87ffffffffffffff, 0xfffeffffffffffe0, 0x07ffffff00007fff,
     0x0000000000000028, 0x000000000000000a, 0x0000050000000000, 0x0000000000002800,
     0x0010000000000000, 0x00000000000003ab, 0x0000000028000000, 0xa000000000741400,
     0x00000140a0000001, 0x0001400000000000, 0x0000000000000014, 0x00003e8000000050,
     0x8000000000000000, 0x000000000000143e, 0x000000000000001e, 0x000000000a000000,
     0x0282800000000000, 0x0500000000000000, 0xd000000000000000, 0x000000000001f400,
     0x5000000000000000, 0x0000000000001400, 0x0000000000050000, 0x0000000000000050,
     0x0000000000500000, 0x0000140000000000, 0x000a500000000000, 0x0000000280000000,
     0x0140000000001450, 0x0050000000000000, 0x0400001000000000, 0x0000420000101404,
     0xffffffffffdfffff, 0x0000000000001fff, 0x00ffffffffff0000, 0x00000c00ffff0fff,
     0x0000400000000000, 0x0000000000008000, 0xf880000000000000, 0x00000007fffff7bb,
     0x000ffffffffffffc, 0x68fc000000000000, 0xffff003ffffffc00, 0x1fffffff0000007f,
     0x0007fffffffffff0, 0x7c00ff9f00000000, 0x000001ffffffffff, 0xc47effff00000ff7,
     0x3e62ffffffffffff, 0x000407ff18000005, 0x00007f7f007e7e7e, 0x00000007ffffffff,
     0xffff000fffffffff, 0x0ffffffffffff87f, 0xffff3fffffffffff, 0x0000000003ffffff,
     0x5f7ffdffa0000000, 0xffffffffffffffdb, 0x0003ffffffffffff, 0xfffffffffff80000,
     0x3fffffffffffffff, 0xffffffffffff0000, 0xfffffffffffcffff, 0x0fff0000000000ff,
     0xffdf000000000000, 0x1fffffffffffffff, 0xfffeffc000000000, 0x7fffffff3fffffff,
     0x000000001cfcfcfc},
    {1,  2,  3, 4,  5,  6, 7, 8, 5, 5, 9, 5, 5, 10, 5, 11, 5, 12, 13, 5, 5, 14, 5, 5, 5, 15,
     16, 17, 5, 18, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5, 5,  5, 5,  5, 5,  5,  5, 5},
    {1,  2,  3,   4,  4,  4,  4,  4,  4,  5,  6,  7,  8,  9,  10, 4,  11,  12, 4,   13, 14,  4,  4,
     2,  2,  2,   2,  15, 16, 4,  4,  17, 18, 19, 20, 21, 4,  22, 4,  23,  24, 25,  26, 27,  28, 29,
     4,  2,  30,  4,  4,  14, 4,  4,  4,  4,  4,  4,  4,  31, 32, 4,  33,  34, 4,   35, 36,  37, 38,
     39, 40, 41,  4,  42, 19, 43, 44, 4,  4,  45, 46, 47, 48, 4,  4,  49,  50, 47,  51, 52,  4,  53,
     4,  4,  4,   54, 4,  4,  55, 4,  4,  56, 57, 58, 59, 60, 61, 4,  4,   4,  4,   62, 63,  64, 4,
     65, 66, 67,  4,  4,  4,  4,  68, 4,  4,  4,  4,  2,  2,  2,  2,  2,   2,  2,   2,  2,   2,  2,
     2,  2,  2,   69, 4,  4,  4,  2,  2,  2,  70, 4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,   2,  2,   2,  2,   2,  2,
     49, 4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  2,   2,  2,   2,  2,
     2,  2,  2,   2,  71, 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  2,  2,   2,  2,  2,  2,  2,  2,  61, 19, 4,  72, 47, 73, 64, 4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  2,  74, 4,  4,  2,  2,  2,  2,  2,  2,  2,   2,  2,   2,  2,   2,  2,
     2,  2,  2,   2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,   2,  2,   2,  2,   2,  2,
     2,  2,  2,   2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,   2,  2,   2,  2,   2,  2,
     2,  2,  2,   2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,   2,  2,   2,  2,   2,  2,
     2,  2,  2,   2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  75, 2,  2,  2,   2,  2,   2,  2,   2,  2,
     2,  2,  76,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     2,  2,  2,   2,  19, 77, 2,  2,  2,  2,  2,  78, 4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  2,   79, 80, 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  81,
     82, 4,  4,   4,  4,  4,  54, 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  2,  2,  2,  83, 4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  84, 85, 86, 4,  4,  4,  4,  4,  87, 88, 4,  89,  90, 4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   91, 4,  92, 4,  4,  4,  4,  93, 94, 4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  95,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     96, 4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  97, 4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  98, 4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  99,  4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  100, 4,  4,   4,  101, 4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  102, 4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  103, 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  2,  2,  2,  2,  2,  2,  2,  2,  12, 4,  4,  4,   4,  4,   4,  4,   4,  4,
     4,  4,  4,   4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4},
    {0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff,
     0x0000000000000000, 0xffffffff1fffffff, 0x000000000001ffff, 0xffffe000ffffffff,
     0x003fffffffff03fd, 0xffffffff3fffffff, 0x000000000000ff0f, 0xffffffffffff0000,
     0x000000003fffffff, 0xffff00ffffffffff, 0x0000000fffffffff, 0x007fffffffffffff,
     0x000000ff003fffff, 0x91bffffffffffd3f, 0x007fffff003fffff, 0x000000007fffffff,
     0x0037ffff00000000, 0x03ffffff003fffff, 0xc0ffffffffffffff, 0x003ffffffeef0001,
     0x1fffffff00000000, 0x000000001fffffff, 0x0000001ffffffeff, 0x003fffffffffffff,
     0x0007ffff003fffff, 0x000000000003ffff, 0x00000000000001ff, 0xffff00801fffffff,
     0x000000000000003f, 0x007fffff00000000, 0x00fffffffffffff8, 0x0000fffffffffff8,
     0x000001ffffff0000, 0x0000007ffffffff8, 0x0047ffffffff0010, 0x0007fffffffffff8,
     0x000000001400001e, 0x00000ffffffbffff, 0xffff01ffbfffbd7f, 0x23edfdfffff99fe0,
     0x00000003e0010000, 0x001fffffffffffff, 0x0000000080000780, 0x0000ffffffffffff,
     0x00000000000000b0, 0x00007fffffffffff, 0x000000000f000000, 0x0000000000000010,
     0x010007ffffffffff, 0x0000000007ffffff, 0x00000fffffffffff, 0x8000000000000000,
     0xfffffcff00000000, 0x0000000a0001ffff, 0x0407fffffffff801, 0xfffffffff0010000,
     0x00000000200003ff, 0x01ffffffffffffff, 0x00007ffffffffdff, 0xfffc000000000001,
     0x000000000000ffff, 0x0001fffffffffb7f, 0xfffffdbf00000040, 0x00000000010003ff,
     0x0007ffff00000000, 0x0000000003ffffff, 0x000000000000000f, 0x000000000000007f,
     0x00003fffffff0000, 0xe0fffff800000000, 0x00000000000107ff, 0x00ffffffffffffff,
     0x0007ffffffffffff, 0xffff00f000070000, 0x0fffffffffffffff, 0x1fff07ffffffffff,
     0x0000000003ff01ff, 0x00001fffffffffff, 0x0000000000004000, 0x000000000000001f,
     0x0af7fe96ffffffef, 0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff, 0x0000000000000003,
     0x0000001400000000, 0x0000000500000000, 0x0000000280000000, 0x0000050000000000,
     0x000000001400140a, 0x2800050000000000, 0x0000000002800000, 0x0000000000014000,
     0x0000000001400000, 0x000000000a000000, 0x0000280000000000, 0x0000000000200000,
     0x0008000000000000, 0x0000000010000000, 0x0000000100000000, 0x0000000080000000}};
static constexpr flat_array<12> __cat_pi{{0x00AB, 0x2018, 0x201B, 0x201C, 0x201F, 0x2039, 0x2E02,
                                          0x2E04, 0x2E09, 0x2E0C, 0x2E1C, 0x2E20}};
static constexpr __range_array __cat_cf = {
    0x00000000, 0x0000AD01, 0x0000AE00, 0x00060001, 0x00060600, 0x00061C01, 0x00061D00,
    0x0006DD01, 0x0006DE00, 0x00070F01, 0x00071000, 0x0008E201, 0x0008E300, 0x00180E01,
    0x00180F00, 0x00200B01, 0x00201000, 0x00202A01, 0x00202F00, 0x00206001, 0x00206500,
    0x00206601, 0x00207000, 0x00FEFF01, 0x00FF0000, 0x00FFF901, 0x00FFFC00, 0x0110BD01,
    0x0110BE00, 0x0110CD01, 0x0110CE00, 0x01343001, 0x01343900, 0x01BCA001, 0x01BCA400,
    0x01D17301, 0x01D17B00, 0x0E000101, 0x0E000200, 0x0E002001, 0x0E008000};
static constexpr __bool_trie<32, 634, 7, 351, 25, 255, 1, 0, 385, 4, 59, 36> __cat_no{
    {0x0000000000000000, 0x0000000000000000, 0x720c000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1,  0, 0, 0, 0, 0, 2,  0,  3, 0, 4,  0,  0, 0, 5, 0, 0, 0, 0, 0,  0, 6,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 7,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     8,  0, 0, 0, 0, 0, 0,  0,  9, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 10, 11, 0, 0, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  14, 15, 16, 0, 0, 0,
     0,  0, 0, 0, 0, 0, 17, 18, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     19, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0,  0,  0, 0, 0,
     0,  0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 24},
    {0x0000000000000000, 0x03f0000000000000, 0x00fc000000000000, 0x0007000000000000,
     0x7f00000000000000, 0x01ff00007f000000, 0x000ffc0000000000, 0x1ffffe0000000000,
     0x03ff000000000000, 0x0000000004000000, 0x03f1000000000000, 0x00000000000003ff,
     0x00000000ffff0000, 0x0000000000000200, 0xffffffff00000000, 0x000000000fffffff,
     0xfffffc0000000000, 0xffc0000000000000, 0x00000000000fffff, 0x2000000000000000,
     0x00000000003c0000, 0x000003ff00000000, 0x00000000fffeff00, 0xfffe0000000003ff,
     0x003f000000000000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1, 2,  3,  0,  0,  0,  0, 4, 5,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  6,  7,  8,  9, 0, 10, 11, 0,  12, 13, 14, 0, 15, 16, 0,  0, 0,  0, 17, 0, 0, 0, 0,
     0, 18, 0,  0,  19, 20, 0, 0, 0,  21, 0,  0,  0,  0,  0, 22, 0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  23, 0,  0,  0,  0, 0,  0,  24, 0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  25, 0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 26, 0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 27,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  28, 0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  29, 0,  30, 0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  31, 0, 0,  0,  0,  0, 0,  0, 0,  0, 0, 0, 0,
     0, 32, 33, 0,  34, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  35},
    {0x0000000000000000, 0x000fffffffffff80, 0x01e0000000000000, 0x0000000000000c00,
     0x0ffffffe00000000, 0x0000000f00000000, 0xfe000000ff000000, 0x0000ff8000000000,
     0xf800000000000000, 0x000000000fc00000, 0x3000000000000000, 0xfffffffffffcffff,
     0x60000000000001ff, 0x00000000e0000000, 0x0000f80000000000, 0xff000000ff000000,
     0x0000fe0000000000, 0xfc00000000000000, 0x7fffffff00000000, 0x0000007fe0000000,
     0x00000000001e0000, 0x0000003ffffc0000, 0x001ffffe00000000, 0x0c00000000000000,
     0x0007fc0000000000, 0x00001ffffc000000, 0x00000000001fffff, 0x00000003f8000000,
     0x00000000007fffff, 0x000fffff00000000, 0x01ffffff00000000, 0x000000000000ff80,
     0xfffe000000000000, 0x001eefffffffffff, 0x3fffbffffffffffe, 0x0000000000001fff}};
static constexpr flat_array<10> __cat_pf{
    {0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, 0x2E1D, 0x2E21}};
static constexpr __range_array __cat_lt = {
    0x00000000, 0x0001C501, 0x0001C600, 0x0001C801, 0x0001C900, 0x0001CB01, 0x0001CC00,
    0x0001F201, 0x0001F300, 0x001F8801, 0x001F9000, 0x001F9801, 0x001FA000, 0x001FA801,
    0x001FB000, 0x001FBC01, 0x001FBD00, 0x001FCC01, 0x001FCD00, 0x001FFC01, 0x001FFD00};
static constexpr __bool_trie<32, 991, 1, 0, 31, 9, 6, 241, 57, 109, 26, 6> __cat_lm{
    {0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0xffff000000000000, 0x0000501f0003ffc3,
     0x0000000000000000, 0x0410000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000002000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000001, 0x0000000000000000, 0x0000006000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0430000000000000},
    {1,  1,  1,  1,  2, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 3,  1,
     3,  1,  1,  1,  1, 1,  1,  1,  4,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  5, 1,  6,  1,  1,  1, 1, 1, 1,  1,  1, 7,  1,  1, 1,  1,
     1,  1,  8,  1,  1, 9,  10, 11, 1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 12, 13, 1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  14, 1, 1, 1, 15, 1,  1, 15, 1,  1, 1,  1,
     1,  1,  1,  16, 1, 17, 18, 1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  19, 1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  8,  1,  1, 1,  1,  20, 21, 22, 1, 23, 24, 25, 26, 1, 1, 1, 1,  1,  1, 1,  27, 1, 24, 1,
     28, 1,  29, 1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1, 1, 1, 1,  1,  1, 1,  1,  1, 1,  1,
     24, 30, 1},
    {0x0000011004000000, 0x0000000000000000, 0x0002000000000000, 0x0000000000000040,
     0x1000000000000000, 0x0000000000800000, 0x0000000000000008, 0x0000008000000000,
     0x3f00000000000000, 0xfffff00000000000, 0x010007ffffffffff, 0xfffffffff8000000,
     0x8002000000000000, 0x000000001fff0000, 0x3000000000000000, 0x0000800000000000,
     0x083e000000000020, 0x0000000060000000, 0x7000000000000000, 0x0000000000200000,
     0x0000000000001000, 0x8000000000000000, 0x0000000030000000, 0x00000000ff800000,
     0x0001000000000000, 0x0000000000000100, 0x0300000000000000, 0x0000004000008000,
     0x0018000020000000, 0x00000000f0000000, 0x00000000c0000000},
    {1, 0, 0, 0, 0, 0, 0, 0, 2},
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5},
    {0x0000000000000000, 0x000000000000000f, 0x00000000fff80000, 0x0000000b00000000,
     0x3f80000000000000, 0x0000000000000800}};
static constexpr __bool_trie<32, 991, 1, 0, 72, 255, 1, 0, 449, 7, 56, 57> __cat_mn{
    {0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0xffffffffffffffff, 0x0000ffffffffffff, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x00000000000000f8, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0xbffffffffffe0000, 0x00000000000000b6,
     0x0000000007ff0000, 0x00010000fffff800, 0x0000000000000000, 0x00003d9f9fc00000,
     0xffff000000020000, 0x00000000000007ff, 0x0001ffc000000000, 0x200ff80000000000},
    {1,  2,  3,  4,  5,  6,  7,  8,  9,  8,  10, 11, 12, 13, 14, 15, 16, 11, 17, 18, 19, 2,  20, 21,
     22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  32, 2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  33, 34, 35, 36, 37, 2,  38, 2,  39, 2,  2,  2,  40,
     41, 42, 2,  43, 44, 45, 46, 47, 2,  2,  48, 2,  2,  2,  49, 2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  50, 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  51, 2,  52, 2,  53, 2,  2,  2,  2,  2,  2,  2,  2,  54, 2,  55, 2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  56, 57, 58, 2,  2,  2,  2,  59, 2,  2,  60, 61, 62, 63, 64, 65,
     66, 67, 68, 2,  2,  2,  69, 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  70, 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  71,
     2,  2,  2,  2,  2,  2,  2},
    {0x00003eeffbc00000, 0x000000000e000000, 0x0000000000000000, 0xfffffffbfff80000,
     0x1400000000000007, 0x0000000c00fe21fe, 0x1000000000000002, 0x4000000c0000201e,
     0x1000000000000006, 0x0023000000023986, 0xfc00000c000021be, 0x9000000000000002,
     0x0000000c0040201e, 0x0000000000000004, 0x0000000000002001, 0xc000000000000011,
     0x0000000c00603dc1, 0x0000000c00003040, 0x1800000000000003, 0x0000000c0000201e,
     0x00000000005c0400, 0x07f2000000000000, 0x0000000000007f80, 0x1ff2000000000000,
     0x0000000000003f00, 0x02a0000003000000, 0x7ffe000000000000, 0x1ffffffffeffe0df,
     0x0000000000000040, 0x66fde00000000000, 0x001e0001c3000000, 0x0000000020002064,
     0x00000000e0000000, 0x001c0000001c0000, 0x000c0000000c0000, 0x3fb0000000000000,
     0x00000000200ffe40, 0x0000000000003800, 0x0000020000000060, 0x0e04018700000000,
     0x0000000009800000, 0x9ff81fe57f400000, 0x3fff000000000000, 0x17d000000000000f,
     0x000ff80000000004, 0x00003b3c00000003, 0x0003a34000000000, 0x00cff00000000000,
     0x031021fdfff70000, 0xfbffffffffffffff, 0x0001ffe21fff0000, 0x0003800000000000,
     0x8000000000000000, 0xffffffff00000000, 0x00003c0000000000, 0x0000000006000000,
     0x3ff0800000000000, 0x00000000c0000000, 0x0003000000000000, 0x0000006000000844,
     0x8003ffff00000030, 0x00003fc000000000, 0x000000000003ff80, 0x33c8000000000007,
     0x0000002000000000, 0x00667e0000000000, 0x1000000000001008, 0xc19d000000000000,
     0x0040300000000002, 0x0000212000000000, 0x0000000040000000, 0x0000ffff0000ffff},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 4, 2, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1,  0,  0,  0,  2,  0, 3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  4,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,
     0,  0,  0,  0,  0,  0, 7,  0,  0,  8,  9,  10, 0,  11, 12, 13, 14, 15, 0,  0,  16, 17, 18, 0,
     0,  19, 20, 21, 22, 0, 0,  23, 24, 25, 26, 27, 0,  28, 0,  0,  0,  29, 0,  0,  0,  0,  0,  0,
     30, 31, 32, 33, 0,  0, 0,  0,  0,  34, 0,  35, 0,  36, 37, 38, 0,  0,  0,  0,  39, 0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  40, 41, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 42, 43, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  44, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 45, 46, 0,  0,  47, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  48, 49, 50, 0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  51, 0,  0,  0,  41, 0,  0,
     0,  0,  0,  0,  52, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  53, 0, 54, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  55, 55, 55, 56},
    {0x0000000000000000, 0x2000000000000000, 0x0000000100000000, 0x07c0000000000000,
     0x870000000000f06e, 0x0000006000000000, 0x000000f000000000, 0x000000000001ffc0,
     0xff00000000000002, 0x800000000000007f, 0x0678000000000003, 0x001fef8000000007,
     0x0008000000000000, 0x7fc0000000000003, 0x0000000000001e00, 0x40d3800000000000,
     0x000007f880000000, 0x1800000000000003, 0x001f1fc000000001, 0xff00000000000000,
     0x000000004000005c, 0x85f8000000000000, 0x000000000000000d, 0xb03c000000000000,
     0x0000000030000001, 0xa7f8000000000000, 0x0000000000000001, 0x00bf280000000000,
     0x00000fbce0000000, 0x06ff800000000000, 0x000000010cf00000, 0x79f80000000007fe,
     0x000000000e7e0080, 0x00000000037ffc00, 0xbf7f000000000000, 0x006dfcfffffc0000,
     0xb47e000000000000, 0x00000000000000bf, 0x0000000000a30000, 0x0018000000000000,
     0x001f000000000000, 0x007f000000000000, 0x0000000000008000, 0x0000000000078000,
     0x0000000060000000, 0xf800038000000000, 0x00003c0000000fe7, 0x000000000000001c,
     0xf87fffffffffffff, 0x00201fffffffffff, 0x0000fffef8000010, 0x000007dbf9ffff7f,
     0x0000f00000000000, 0x00000000007f0000, 0x00000000000007f0, 0xffffffffffffffff,
     0x0000ffffffffffff}};
static constexpr __range_array __cat_me = {0x00000000, 0x00048801, 0x00048A00, 0x001ABE01,
                                           0x001ABF00, 0x0020DD01, 0x0020E100, 0x0020E201,
                                           0x0020E500, 0x00A67001, 0x00A67300};
static constexpr __bool_trie<0, 652, 4, 336, 42, 13, 1, 242, 134, 64, 58, 31> __cat_mc{
    {},
    {1,  2,  3, 4,  5,  6,  5,  7, 8,  4,  9, 10, 11, 12, 8,  13, 3,  14, 15, 16, 0,  0, 0,  0,  9,
     17, 0,  0, 18, 19, 20, 0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 21, 22, 0, 0,  0,  0,  23, 0,  0,  0,  24, 25, 0,  0, 26, 27, 28,
     29, 30, 0, 0,  31, 0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  32, 0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,
     0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0, 33, 0,  34, 35, 0,  36, 37, 6,  38, 39, 0, 40, 0,  0,
     0,  41},
    {0x0000000000000000, 0xc800000000000008, 0x000000000000de01, 0xc00000000000000c,
     0x0000000000801981, 0xc000000000000008, 0x0000000000000001, 0x0000000000001a01,
     0x400000000000000c, 0xc000000000000000, 0x0000000000801dc6, 0x000000000000000e,
     0x000000000000001e, 0x0000000000600d9f, 0x0000000000801dc1, 0x000000000000000c,
     0x000c0000ff038000, 0x8000000000000000, 0x1902180000000000, 0x00003f9c00c00000,
     0x000000001c009f98, 0xc040000000000000, 0x00000000000001bf, 0x01fb0e7800000000,
     0x0000000006000000, 0x0007e01a00a00000, 0xe820000000000010, 0x000000000000001b,
     0x000004c200000004, 0x000c5c8000000000, 0x00300ff000000000, 0x0080000200000000,
     0x0000c00000000000, 0x0000009800000000, 0xfff0000000000003, 0x000000000000000f,
     0x00000000000c0000, 0xcc30000000000008, 0x0019800000000000, 0x2800000000002000,
     0x0020c80000000000, 0x000016d800000000},
    {1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3},
    {1, 0,  2,  0,  3,  4,  5, 6, 7,  0,  0,  8,  9, 10, 0, 0, 11, 12, 13, 14, 0, 0, 15,
     0, 16, 0,  17, 0,  18, 0, 0, 0,  19, 0,  0,  0, 0,  0, 0, 20, 21, 22, 23, 0, 0, 0,
     0, 0,  24, 0,  25, 0,  0, 0, 26, 0,  0,  0,  0, 27, 0, 0, 0,  0,  0,  0,  0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0,  0, 0, 0,
     0, 0,  0,  0,  0,  0,  0, 0, 0,  0,  28, 29, 0, 0,  0, 0, 0,  0,  30},
    {0x0000000000000000, 0x0000000000000005, 0x0187000000000004, 0x0000100000000000,
     0x0000000000000060, 0x8038000000000004, 0x0000000000000001, 0x002c700000000000,
     0x0000000700000000, 0xc00000000000000c, 0x0000000c0080399e, 0x00e0000000000000,
     0x0000000000000023, 0x7a07000000000000, 0x0000000000000002, 0x4f03800000000000,
     0x5807000000000000, 0x0040d00000000000, 0x0000004300000000, 0x0100700000000000,
     0x00000010f00e0000, 0x0200000000000000, 0x0000000001800000, 0x0000000000800000,
     0x4000800000000000, 0x0012020000000000, 0x0000000000587c00, 0x0060000000000000,
     0xfffffffffffe0000, 0x00000000000000ff, 0x0007e06000000000}};
static constexpr __range_array __cat_nl = {
    0x00000000, 0x0016EE01, 0x0016F100, 0x00216001, 0x00218300, 0x00218501, 0x00218900,
    0x00300701, 0x00300800, 0x00302101, 0x00302A00, 0x00303801, 0x00303B00, 0x00A6E601,
    0x00A6F000, 0x01014001, 0x01017500, 0x01034101, 0x01034200, 0x01034A01, 0x01034B00,
    0x0103D101, 0x0103D600, 0x01240001, 0x01246F00};
static constexpr flat_array<1> __cat_zl{{0x2028}};
static constexpr flat_array<1> __cat_zp{{0x2029}};
static constexpr flat_array<3> __cat_cs{{0xDB7E, 0xDBFE, 0xDFFE}};
static constexpr flat_array<3> __cat_co{{0xF8FE, 0xFFFFC, 0x10FFFC}};
template<uni::version v = uni::version::standard_unicode_version>
constexpr category cp_category(char32_t cp);
template<version v>
constexpr category __get_category_for_version(char32_t, category c);
template<version v>
constexpr category __get_category(char32_t c) {
    if(auto cat = __get_category_for_version<v>(c, category::cn); cat != category::cn)
        return cat;

    if(__cat_co.lookup(c))
        return category::co;
    if(__cat_lo.lookup(c))
        return category::lo;
    if(__cat_so.lookup(c))
        return category::so;
    if(__cat_ll.lookup(c))
        return category::ll;
    if(__cat_cs.lookup(c))
        return category::cs;
    if(__cat_mn.lookup(c))
        return category::mn;
    if(__cat_lu.lookup(c))
        return category::lu;
    if(__cat_sm.lookup(c))
        return category::sm;
    if(__cat_no.lookup(c))
        return category::no;
    if(__cat_nd.lookup(c))
        return category::nd;
    if(__cat_po.lookup(c))
        return category::po;
    if(__cat_mc.lookup(c))
        return category::mc;
    if(__cat_lm.lookup(c))
        return category::lm;
    if(__cat_nl.lookup(c))
        return category::nl;
    if(__cat_cf.lookup(c))
        return category::cf;
    if(__cat_sk.lookup(c))
        return category::sk;
    if(__cat_ps.lookup(c))
        return category::ps;
    if(__cat_pe.lookup(c))
        return category::pe;
    if(__cat_cc.lookup(c))
        return category::cc;
    if(__cat_sc.lookup(c))
        return category::sc;
    if(__cat_lt.lookup(c))
        return category::lt;
    if(__cat_pd.lookup(c))
        return category::pd;
    if(__cat_zs.lookup(c))
        return category::zs;
    if(__cat_me.lookup(c))
        return category::me;
    if(__cat_pi.lookup(c))
        return category::pi;
    if(__cat_pf.lookup(c))
        return category::pf;
    if(__cat_pc.lookup(c))
        return category::pc;
    if(__cat_zp.lookup(c))
        return category::zp;
    if(__cat_zl.lookup(c))
        return category::zl;
    return category::cn;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::co, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_co.lookup(c) ? category::co : category::cn) ==
           category::co;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::lo, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_lo.lookup(c) ? category::lo : category::cn) ==
           category::lo;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::so, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_so.lookup(c) ? category::so : category::cn) ==
           category::so;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::ll, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_ll.lookup(c) ? category::ll : category::cn) ==
           category::ll;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::cs, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_cs.lookup(c) ? category::cs : category::cn) ==
           category::cs;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::mn, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_mn.lookup(c) ? category::mn : category::cn) ==
           category::mn;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::lu, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_lu.lookup(c) ? category::lu : category::cn) ==
           category::lu;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::sm, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_sm.lookup(c) ? category::sm : category::cn) ==
           category::sm;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::no, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_no.lookup(c) ? category::no : category::cn) ==
           category::no;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::nd, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_nd.lookup(c) ? category::nd : category::cn) ==
           category::nd;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::po, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_po.lookup(c) ? category::po : category::cn) ==
           category::po;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::mc, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_mc.lookup(c) ? category::mc : category::cn) ==
           category::mc;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::lm, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_lm.lookup(c) ? category::lm : category::cn) ==
           category::lm;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::nl, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_nl.lookup(c) ? category::nl : category::cn) ==
           category::nl;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::cf, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_cf.lookup(c) ? category::cf : category::cn) ==
           category::cf;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::sk, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_sk.lookup(c) ? category::sk : category::cn) ==
           category::sk;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::ps, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_ps.lookup(c) ? category::ps : category::cn) ==
           category::ps;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::pe, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_pe.lookup(c) ? category::pe : category::cn) ==
           category::pe;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::cc, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_cc.lookup(c) ? category::cc : category::cn) ==
           category::cc;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::sc, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_sc.lookup(c) ? category::sc : category::cn) ==
           category::sc;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::lt, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_lt.lookup(c) ? category::lt : category::cn) ==
           category::lt;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::pd, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_pd.lookup(c) ? category::pd : category::cn) ==
           category::pd;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::zs, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_zs.lookup(c) ? category::zs : category::cn) ==
           category::zs;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::me, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_me.lookup(c) ? category::me : category::cn) ==
           category::me;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::pi, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_pi.lookup(c) ? category::pi : category::cn) ==
           category::pi;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::pf, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_pf.lookup(c) ? category::pf : category::cn) ==
           category::pf;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::pc, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_pc.lookup(c) ? category::pc : category::cn) ==
           category::pc;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::zp, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_zp.lookup(c) ? category::zp : category::cn) ==
           category::zp;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::zl, int> = 0>
constexpr bool cp_is(char32_t c) {
    return __get_category_for_version<v>(c, __cat_zl.lookup(c) ? category::zl : category::cn) ==
           category::zl;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::cased_letter, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_ll.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::ll;
    }
    if(cat == category::cn && __cat_lu.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::lu;
    }
    if(cat == category::cn && __cat_lt.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::lt;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::ll || cat == category::lu || cat == category::lt || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::letter, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_lo.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::lo;
    }
    if(cat == category::cn && __cat_ll.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::ll;
    }
    if(cat == category::cn && __cat_lu.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::lu;
    }
    if(cat == category::cn && __cat_lm.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::lm;
    }
    if(cat == category::cn && __cat_lt.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::lt;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::lo || cat == category::ll || cat == category::lu ||
           cat == category::lm || cat == category::lt || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::mark, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_mn.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::mn;
    }
    if(cat == category::cn && __cat_mc.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::mc;
    }
    if(cat == category::cn && __cat_me.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::me;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::mn || cat == category::mc || cat == category::me || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::number, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_no.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::no;
    }
    if(cat == category::cn && __cat_nd.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::nd;
    }
    if(cat == category::cn && __cat_nl.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::nl;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::no || cat == category::nd || cat == category::nl || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::punctuation, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_po.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::po;
    }
    if(cat == category::cn && __cat_ps.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::ps;
    }
    if(cat == category::cn && __cat_pe.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::pe;
    }
    if(cat == category::cn && __cat_pd.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::pd;
    }
    if(cat == category::cn && __cat_pi.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::pi;
    }
    if(cat == category::cn && __cat_pf.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::pf;
    }
    if(cat == category::cn && __cat_pc.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::pc;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::po || cat == category::ps || cat == category::pe ||
           cat == category::pd || cat == category::pi || cat == category::pf ||
           cat == category::pc || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::symbol, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_so.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::so;
    }
    if(cat == category::cn && __cat_sm.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::sm;
    }
    if(cat == category::cn && __cat_sk.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::sk;
    }
    if(cat == category::cn && __cat_sc.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::sc;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::so || cat == category::sm || cat == category::sk ||
           cat == category::sc || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::separator, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_zs.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::zs;
    }
    if(cat == category::cn && __cat_zp.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::zp;
    }
    if(cat == category::cn && __cat_zl.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::zl;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::zs || cat == category::zp || cat == category::zl || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::other, int> = 0>
constexpr bool cp_is(char32_t c) {
    category cat = category::cn;
    if(cat == category::cn && __cat_co.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::co;
    }
    if(cat == category::cn && __cat_cs.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::cs;
    }
    if(cat == category::cn && __cat_cf.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::cf;
    }
    if(cat == category::cn && __cat_cc.lookup(c)) {
        if constexpr(v == uni::version::latest_version)
            return true;
        cat = category::cc;
    }
    cat = __get_category_for_version<v>(c, cat);
    return cat == category::co || cat == category::cs || cat == category::cf ||
           cat == category::cc || false;
}
template<category category_, version v = uni::version::standard_unicode_version,
         std::enable_if_t<category_ == category::unassigned, int> = 0>
constexpr bool cp_is(char32_t c) {
    return cp_category(c) == category::unassigned;
}
static constexpr std::array __cat_version_data_v11_0{
    std::pair{0x166D, category::po}, std::pair{0x1CF2, category::mc},
    std::pair{0x1CF3, category::mc}, std::pair{0xA9BD, category::mc}};
static constexpr std::array __cat_version_data_v10_0{
    std::pair{0x10D0, category::lo},  std::pair{0x10D1, category::lo},
    std::pair{0x10D2, category::lo},  std::pair{0x10D3, category::lo},
    std::pair{0x10D4, category::lo},  std::pair{0x10D5, category::lo},
    std::pair{0x10D6, category::lo},  std::pair{0x10D7, category::lo},
    std::pair{0x10D8, category::lo},  std::pair{0x10D9, category::lo},
    std::pair{0x10DA, category::lo},  std::pair{0x10DB, category::lo},
    std::pair{0x10DC, category::lo},  std::pair{0x10DD, category::lo},
    std::pair{0x10DE, category::lo},  std::pair{0x10DF, category::lo},
    std::pair{0x10E0, category::lo},  std::pair{0x10E1, category::lo},
    std::pair{0x10E2, category::lo},  std::pair{0x10E3, category::lo},
    std::pair{0x10E4, category::lo},  std::pair{0x10E5, category::lo},
    std::pair{0x10E6, category::lo},  std::pair{0x10E7, category::lo},
    std::pair{0x10E8, category::lo},  std::pair{0x10E9, category::lo},
    std::pair{0x10EA, category::lo},  std::pair{0x10EB, category::lo},
    std::pair{0x10EC, category::lo},  std::pair{0x10ED, category::lo},
    std::pair{0x10EE, category::lo},  std::pair{0x10EF, category::lo},
    std::pair{0x10F0, category::lo},  std::pair{0x10F1, category::lo},
    std::pair{0x10F2, category::lo},  std::pair{0x10F3, category::lo},
    std::pair{0x10F4, category::lo},  std::pair{0x10F5, category::lo},
    std::pair{0x10F6, category::lo},  std::pair{0x10F7, category::lo},
    std::pair{0x10F8, category::lo},  std::pair{0x10F9, category::lo},
    std::pair{0x10FA, category::lo},  std::pair{0x10FD, category::lo},
    std::pair{0x10FE, category::lo},  std::pair{0x10FF, category::lo},
    std::pair{0x111C9, category::po}, std::pair{0x11A07, category::mc},
    std::pair{0x11A08, category::mc}};
template<version v>
constexpr category __get_category_for_version([[maybe_unused]] char32_t cp, category c) {
    if constexpr(v <= uni::version::v11_0) {
        const auto it =
            uni::lower_bound(__cat_version_data_v11_0.begin(), __cat_version_data_v11_0.end(), cp,
                             [](const auto& e, char32_t cp) { return e.first < cp; });
        if(it != __cat_version_data_v11_0.end() && cp == it->first)
            c = it->second;
    }
    if constexpr(v <= uni::version::v10_0) {
        const auto it =
            uni::lower_bound(__cat_version_data_v10_0.begin(), __cat_version_data_v10_0.end(), cp,
                             [](const auto& e, char32_t cp) { return e.first < cp; });
        if(it != __cat_version_data_v10_0.end() && cp == it->first)
            c = it->second;
    }
    return c;
}
enum class block {
    no_block,
    nb = no_block,
    basic_latin,
    ascii = basic_latin,
    latin_1_supplement,
    latin_1_sup = latin_1_supplement,
    latin_extended_a,
    latin_ext_a = latin_extended_a,
    latin_extended_b,
    latin_ext_b = latin_extended_b,
    ipa_extensions,
    ipa_ext = ipa_extensions,
    spacing_modifier_letters,
    modifier_letters = spacing_modifier_letters,
    combining_diacritical_marks,
    diacriticals = combining_diacritical_marks,
    greek_and_coptic,
    greek = greek_and_coptic,
    cyrillic,
    cyrillic_supplement,
    cyrillic_sup = cyrillic_supplement,
    armenian,
    hebrew,
    arabic,
    syriac,
    arabic_supplement,
    arabic_sup = arabic_supplement,
    thaana,
    nko,
    samaritan,
    mandaic,
    syriac_supplement,
    syriac_sup = syriac_supplement,
    arabic_extended_a,
    arabic_ext_a = arabic_extended_a,
    devanagari,
    bengali,
    gurmukhi,
    gujarati,
    oriya,
    tamil,
    telugu,
    kannada,
    malayalam,
    sinhala,
    thai,
    lao,
    tibetan,
    myanmar,
    georgian,
    hangul_jamo,
    jamo = hangul_jamo,
    ethiopic,
    ethiopic_supplement,
    ethiopic_sup = ethiopic_supplement,
    cherokee,
    unified_canadian_aboriginal_syllabics,
    ucas = unified_canadian_aboriginal_syllabics,
    ogham,
    runic,
    tagalog,
    hanunoo,
    buhid,
    tagbanwa,
    khmer,
    mongolian,
    unified_canadian_aboriginal_syllabics_extended,
    ucas_ext = unified_canadian_aboriginal_syllabics_extended,
    limbu,
    tai_le,
    new_tai_lue,
    khmer_symbols,
    buginese,
    tai_tham,
    combining_diacritical_marks_extended,
    diacriticals_ext = combining_diacritical_marks_extended,
    balinese,
    sundanese,
    batak,
    lepcha,
    ol_chiki,
    cyrillic_extended_c,
    cyrillic_ext_c = cyrillic_extended_c,
    georgian_extended,
    georgian_ext = georgian_extended,
    sundanese_supplement,
    sundanese_sup = sundanese_supplement,
    vedic_extensions,
    vedic_ext = vedic_extensions,
    phonetic_extensions,
    phonetic_ext = phonetic_extensions,
    phonetic_extensions_supplement,
    phonetic_ext_sup = phonetic_extensions_supplement,
    combining_diacritical_marks_supplement,
    diacriticals_sup = combining_diacritical_marks_supplement,
    latin_extended_additional,
    latin_ext_additional = latin_extended_additional,
    greek_extended,
    greek_ext = greek_extended,
    general_punctuation,
    punctuation = general_punctuation,
    superscripts_and_subscripts,
    super_and_sub = superscripts_and_subscripts,
    currency_symbols,
    combining_diacritical_marks_for_symbols,
    diacriticals_for_symbols = combining_diacritical_marks_for_symbols,
    letterlike_symbols,
    number_forms,
    arrows,
    mathematical_operators,
    math_operators = mathematical_operators,
    miscellaneous_technical,
    misc_technical = miscellaneous_technical,
    control_pictures,
    optical_character_recognition,
    ocr = optical_character_recognition,
    enclosed_alphanumerics,
    enclosed_alphanum = enclosed_alphanumerics,
    box_drawing,
    block_elements,
    geometric_shapes,
    miscellaneous_symbols,
    misc_symbols = miscellaneous_symbols,
    dingbats,
    miscellaneous_mathematical_symbols_a,
    misc_math_symbols_a = miscellaneous_mathematical_symbols_a,
    supplemental_arrows_a,
    sup_arrows_a = supplemental_arrows_a,
    braille_patterns,
    braille = braille_patterns,
    supplemental_arrows_b,
    sup_arrows_b = supplemental_arrows_b,
    miscellaneous_mathematical_symbols_b,
    misc_math_symbols_b = miscellaneous_mathematical_symbols_b,
    supplemental_mathematical_operators,
    sup_math_operators = supplemental_mathematical_operators,
    miscellaneous_symbols_and_arrows,
    misc_arrows = miscellaneous_symbols_and_arrows,
    glagolitic,
    latin_extended_c,
    latin_ext_c = latin_extended_c,
    coptic,
    georgian_supplement,
    georgian_sup = georgian_supplement,
    tifinagh,
    ethiopic_extended,
    ethiopic_ext = ethiopic_extended,
    cyrillic_extended_a,
    cyrillic_ext_a = cyrillic_extended_a,
    supplemental_punctuation,
    sup_punctuation = supplemental_punctuation,
    cjk_radicals_supplement,
    cjk_radicals_sup = cjk_radicals_supplement,
    kangxi_radicals,
    kangxi = kangxi_radicals,
    ideographic_description_characters,
    idc = ideographic_description_characters,
    cjk_symbols_and_punctuation,
    cjk_symbols = cjk_symbols_and_punctuation,
    hiragana,
    katakana,
    bopomofo,
    hangul_compatibility_jamo,
    compat_jamo = hangul_compatibility_jamo,
    kanbun,
    bopomofo_extended,
    bopomofo_ext = bopomofo_extended,
    cjk_strokes,
    katakana_phonetic_extensions,
    katakana_ext = katakana_phonetic_extensions,
    enclosed_cjk_letters_and_months,
    enclosed_cjk = enclosed_cjk_letters_and_months,
    cjk_compatibility,
    cjk_compat = cjk_compatibility,
    cjk_unified_ideographs_extension_a,
    cjk_ext_a = cjk_unified_ideographs_extension_a,
    yijing_hexagram_symbols,
    yijing = yijing_hexagram_symbols,
    cjk_unified_ideographs,
    cjk = cjk_unified_ideographs,
    yi_syllables,
    yi_radicals,
    lisu,
    vai,
    cyrillic_extended_b,
    cyrillic_ext_b = cyrillic_extended_b,
    bamum,
    modifier_tone_letters,
    latin_extended_d,
    latin_ext_d = latin_extended_d,
    syloti_nagri,
    common_indic_number_forms,
    indic_number_forms = common_indic_number_forms,
    phags_pa,
    saurashtra,
    devanagari_extended,
    devanagari_ext = devanagari_extended,
    kayah_li,
    rejang,
    hangul_jamo_extended_a,
    jamo_ext_a = hangul_jamo_extended_a,
    javanese,
    myanmar_extended_b,
    myanmar_ext_b = myanmar_extended_b,
    cham,
    myanmar_extended_a,
    myanmar_ext_a = myanmar_extended_a,
    tai_viet,
    meetei_mayek_extensions,
    meetei_mayek_ext = meetei_mayek_extensions,
    ethiopic_extended_a,
    ethiopic_ext_a = ethiopic_extended_a,
    latin_extended_e,
    latin_ext_e = latin_extended_e,
    cherokee_supplement,
    cherokee_sup = cherokee_supplement,
    meetei_mayek,
    hangul_syllables,
    hangul = hangul_syllables,
    hangul_jamo_extended_b,
    jamo_ext_b = hangul_jamo_extended_b,
    high_surrogates,
    high_private_use_surrogates,
    high_pu_surrogates = high_private_use_surrogates,
    low_surrogates,
    private_use_area,
    pua = private_use_area,
    cjk_compatibility_ideographs,
    cjk_compat_ideographs = cjk_compatibility_ideographs,
    alphabetic_presentation_forms,
    alphabetic_pf = alphabetic_presentation_forms,
    arabic_presentation_forms_a,
    arabic_pf_a = arabic_presentation_forms_a,
    variation_selectors,
    vs = variation_selectors,
    vertical_forms,
    combining_half_marks,
    half_marks = combining_half_marks,
    cjk_compatibility_forms,
    cjk_compat_forms = cjk_compatibility_forms,
    small_form_variants,
    small_forms = small_form_variants,
    arabic_presentation_forms_b,
    arabic_pf_b = arabic_presentation_forms_b,
    halfwidth_and_fullwidth_forms,
    half_and_full_forms = halfwidth_and_fullwidth_forms,
    specials,
    linear_b_syllabary,
    linear_b_ideograms,
    aegean_numbers,
    ancient_greek_numbers,
    ancient_symbols,
    phaistos_disc,
    phaistos = phaistos_disc,
    lycian,
    carian,
    coptic_epact_numbers,
    old_italic,
    gothic,
    old_permic,
    ugaritic,
    old_persian,
    deseret,
    shavian,
    osmanya,
    osage,
    elbasan,
    caucasian_albanian,
    linear_a,
    cypriot_syllabary,
    imperial_aramaic,
    palmyrene,
    nabataean,
    hatran,
    phoenician,
    lydian,
    meroitic_hieroglyphs,
    meroitic_cursive,
    kharoshthi,
    old_south_arabian,
    old_north_arabian,
    manichaean,
    avestan,
    inscriptional_parthian,
    inscriptional_pahlavi,
    psalter_pahlavi,
    old_turkic,
    old_hungarian,
    hanifi_rohingya,
    rumi_numeral_symbols,
    rumi = rumi_numeral_symbols,
    old_sogdian,
    sogdian,
    elymaic,
    brahmi,
    kaithi,
    sora_sompeng,
    chakma,
    mahajani,
    sharada,
    sinhala_archaic_numbers,
    khojki,
    multani,
    khudawadi,
    grantha,
    newa,
    tirhuta,
    siddham,
    modi,
    mongolian_supplement,
    mongolian_sup = mongolian_supplement,
    takri,
    ahom,
    dogra,
    warang_citi,
    nandinagari,
    zanabazar_square,
    soyombo,
    pau_cin_hau,
    bhaiksuki,
    marchen,
    masaram_gondi,
    gunjala_gondi,
    makasar,
    tamil_supplement,
    tamil_sup = tamil_supplement,
    cuneiform,
    cuneiform_numbers_and_punctuation,
    cuneiform_numbers = cuneiform_numbers_and_punctuation,
    early_dynastic_cuneiform,
    egyptian_hieroglyphs,
    egyptian_hieroglyph_format_controls,
    anatolian_hieroglyphs,
    bamum_supplement,
    bamum_sup = bamum_supplement,
    mro,
    bassa_vah,
    pahawh_hmong,
    medefaidrin,
    miao,
    ideographic_symbols_and_punctuation,
    ideographic_symbols = ideographic_symbols_and_punctuation,
    tangut,
    tangut_components,
    kana_supplement,
    kana_sup = kana_supplement,
    kana_extended_a,
    kana_ext_a = kana_extended_a,
    small_kana_extension,
    small_kana_ext = small_kana_extension,
    nushu,
    duployan,
    shorthand_format_controls,
    byzantine_musical_symbols,
    byzantine_music = byzantine_musical_symbols,
    musical_symbols,
    music = musical_symbols,
    ancient_greek_musical_notation,
    ancient_greek_music = ancient_greek_musical_notation,
    mayan_numerals,
    tai_xuan_jing_symbols,
    tai_xuan_jing = tai_xuan_jing_symbols,
    counting_rod_numerals,
    counting_rod = counting_rod_numerals,
    mathematical_alphanumeric_symbols,
    math_alphanum = mathematical_alphanumeric_symbols,
    sutton_signwriting,
    glagolitic_supplement,
    glagolitic_sup = glagolitic_supplement,
    nyiakeng_puachue_hmong,
    wancho,
    mende_kikakui,
    adlam,
    indic_siyaq_numbers,
    ottoman_siyaq_numbers,
    arabic_mathematical_alphabetic_symbols,
    arabic_math = arabic_mathematical_alphabetic_symbols,
    mahjong_tiles,
    mahjong = mahjong_tiles,
    domino_tiles,
    domino = domino_tiles,
    playing_cards,
    enclosed_alphanumeric_supplement,
    enclosed_alphanum_sup = enclosed_alphanumeric_supplement,
    enclosed_ideographic_supplement,
    enclosed_ideographic_sup = enclosed_ideographic_supplement,
    miscellaneous_symbols_and_pictographs,
    misc_pictographs = miscellaneous_symbols_and_pictographs,
    emoticons,
    ornamental_dingbats,
    transport_and_map_symbols,
    transport_and_map = transport_and_map_symbols,
    alchemical_symbols,
    alchemical = alchemical_symbols,
    geometric_shapes_extended,
    geometric_shapes_ext = geometric_shapes_extended,
    supplemental_arrows_c,
    sup_arrows_c = supplemental_arrows_c,
    supplemental_symbols_and_pictographs,
    sup_symbols_and_pictographs = supplemental_symbols_and_pictographs,
    chess_symbols,
    symbols_and_pictographs_extended_a,
    symbols_and_pictographs_ext_a = symbols_and_pictographs_extended_a,
    cjk_unified_ideographs_extension_b,
    cjk_ext_b = cjk_unified_ideographs_extension_b,
    cjk_unified_ideographs_extension_c,
    cjk_ext_c = cjk_unified_ideographs_extension_c,
    cjk_unified_ideographs_extension_d,
    cjk_ext_d = cjk_unified_ideographs_extension_d,
    cjk_unified_ideographs_extension_e,
    cjk_ext_e = cjk_unified_ideographs_extension_e,
    cjk_unified_ideographs_extension_f,
    cjk_ext_f = cjk_unified_ideographs_extension_f,
    cjk_compatibility_ideographs_supplement,
    cjk_compat_ideographs_sup = cjk_compatibility_ideographs_supplement,
    tags,
    variation_selectors_supplement,
    vs_sup = variation_selectors_supplement,
    supplementary_private_use_area_a,
    sup_pua_a = supplementary_private_use_area_a,
    supplementary_private_use_area_b,
    sup_pua_b = supplementary_private_use_area_b,
    __max
};
static constexpr const std::array __blocks_names = {
    __string_with_idx{"adlam", 272},
    __string_with_idx{"aegean_numbers", 166},
    __string_with_idx{"ahom", 226},
    __string_with_idx{"alchemical", 285},
    __string_with_idx{"alchemical_symbols", 285},
    __string_with_idx{"alphabetic_pf", 154},
    __string_with_idx{"alphabetic_presentation_forms", 154},
    __string_with_idx{"anatolian_hieroglyphs", 244},
    __string_with_idx{"ancient_greek_music", 262},
    __string_with_idx{"ancient_greek_musical_notation", 262},
    __string_with_idx{"ancient_greek_numbers", 167},
    __string_with_idx{"ancient_symbols", 168},
    __string_with_idx{"arabic", 13},
    __string_with_idx{"arabic_ext_a", 21},
    __string_with_idx{"arabic_extended_a", 21},
    __string_with_idx{"arabic_math", 275},
    __string_with_idx{"arabic_mathematical_alphabetic_symbols", 275},
    __string_with_idx{"arabic_pf_a", 155},
    __string_with_idx{"arabic_pf_b", 161},
    __string_with_idx{"arabic_presentation_forms_a", 155},
    __string_with_idx{"arabic_presentation_forms_b", 161},
    __string_with_idx{"arabic_sup", 15},
    __string_with_idx{"arabic_supplement", 15},
    __string_with_idx{"armenian", 11},
    __string_with_idx{"arrows", 78},
    __string_with_idx{"ascii", 1},
    __string_with_idx{"avestan", 198},
    __string_with_idx{"balinese", 58},
    __string_with_idx{"bamum", 126},
    __string_with_idx{"bamum_sup", 245},
    __string_with_idx{"bamum_supplement", 245},
    __string_with_idx{"basic_latin", 1},
    __string_with_idx{"bassa_vah", 247},
    __string_with_idx{"batak", 60},
    __string_with_idx{"bengali", 23},
    __string_with_idx{"bhaiksuki", 233},
    __string_with_idx{"block_elements", 85},
    __string_with_idx{"bopomofo", 110},
    __string_with_idx{"bopomofo_ext", 113},
    __string_with_idx{"bopomofo_extended", 113},
    __string_with_idx{"box_drawing", 84},
    __string_with_idx{"brahmi", 209},
    __string_with_idx{"braille", 91},
    __string_with_idx{"braille_patterns", 91},
    __string_with_idx{"buginese", 55},
    __string_with_idx{"buhid", 46},
    __string_with_idx{"byzantine_music", 260},
    __string_with_idx{"byzantine_musical_symbols", 260},
    __string_with_idx{"carian", 171},
    __string_with_idx{"caucasian_albanian", 183},
    __string_with_idx{"chakma", 212},
    __string_with_idx{"cham", 139},
    __string_with_idx{"cherokee", 40},
    __string_with_idx{"cherokee_sup", 145},
    __string_with_idx{"cherokee_supplement", 145},
    __string_with_idx{"chess_symbols", 289},
    __string_with_idx{"cjk", 120},
    __string_with_idx{"cjk_compat", 117},
    __string_with_idx{"cjk_compat_forms", 159},
    __string_with_idx{"cjk_compat_ideographs", 153},
    __string_with_idx{"cjk_compat_ideographs_sup", 296},
    __string_with_idx{"cjk_compatibility", 117},
    __string_with_idx{"cjk_compatibility_forms", 159},
    __string_with_idx{"cjk_compatibility_ideographs", 153},
    __string_with_idx{"cjk_compatibility_ideographs_supplement", 296},
    __string_with_idx{"cjk_ext_a", 118},
    __string_with_idx{"cjk_ext_b", 291},
    __string_with_idx{"cjk_ext_c", 292},
    __string_with_idx{"cjk_ext_d", 293},
    __string_with_idx{"cjk_ext_e", 294},
    __string_with_idx{"cjk_ext_f", 295},
    __string_with_idx{"cjk_radicals_sup", 104},
    __string_with_idx{"cjk_radicals_supplement", 104},
    __string_with_idx{"cjk_strokes", 114},
    __string_with_idx{"cjk_symbols", 107},
    __string_with_idx{"cjk_symbols_and_punctuation", 107},
    __string_with_idx{"cjk_unified_ideographs", 120},
    __string_with_idx{"cjk_unified_ideographs_extension_a", 118},
    __string_with_idx{"cjk_unified_ideographs_extension_b", 291},
    __string_with_idx{"cjk_unified_ideographs_extension_c", 292},
    __string_with_idx{"cjk_unified_ideographs_extension_d", 293},
    __string_with_idx{"cjk_unified_ideographs_extension_e", 294},
    __string_with_idx{"cjk_unified_ideographs_extension_f", 295},
    __string_with_idx{"combining_diacritical_marks", 7},
    __string_with_idx{"combining_diacritical_marks_extended", 57},
    __string_with_idx{"combining_diacritical_marks_for_symbols", 75},
    __string_with_idx{"combining_diacritical_marks_supplement", 69},
    __string_with_idx{"combining_half_marks", 158},
    __string_with_idx{"common_indic_number_forms", 130},
    __string_with_idx{"compat_jamo", 111},
    __string_with_idx{"control_pictures", 81},
    __string_with_idx{"coptic", 98},
    __string_with_idx{"coptic_epact_numbers", 172},
    __string_with_idx{"counting_rod", 265},
    __string_with_idx{"counting_rod_numerals", 265},
    __string_with_idx{"cuneiform", 239},
    __string_with_idx{"cuneiform_numbers", 240},
    __string_with_idx{"cuneiform_numbers_and_punctuation", 240},
    __string_with_idx{"currency_symbols", 74},
    __string_with_idx{"cypriot_syllabary", 185},
    __string_with_idx{"cyrillic", 9},
    __string_with_idx{"cyrillic_ext_a", 102},
    __string_with_idx{"cyrillic_ext_b", 125},
    __string_with_idx{"cyrillic_ext_c", 63},
    __string_with_idx{"cyrillic_extended_a", 102},
    __string_with_idx{"cyrillic_extended_b", 125},
    __string_with_idx{"cyrillic_extended_c", 63},
    __string_with_idx{"cyrillic_sup", 10},
    __string_with_idx{"cyrillic_supplement", 10},
    __string_with_idx{"deseret", 178},
    __string_with_idx{"devanagari", 22},
    __string_with_idx{"devanagari_ext", 133},
    __string_with_idx{"devanagari_extended", 133},
    __string_with_idx{"diacriticals", 7},
    __string_with_idx{"diacriticals_ext", 57},
    __string_with_idx{"diacriticals_for_symbols", 75},
    __string_with_idx{"diacriticals_sup", 69},
    __string_with_idx{"dingbats", 88},
    __string_with_idx{"dogra", 227},
    __string_with_idx{"domino", 277},
    __string_with_idx{"domino_tiles", 277},
    __string_with_idx{"duployan", 258},
    __string_with_idx{"early_dynastic_cuneiform", 241},
    __string_with_idx{"egyptian_hieroglyph_format_controls", 243},
    __string_with_idx{"egyptian_hieroglyphs", 242},
    __string_with_idx{"elbasan", 182},
    __string_with_idx{"elymaic", 208},
    __string_with_idx{"emoticons", 282},
    __string_with_idx{"enclosed_alphanum", 83},
    __string_with_idx{"enclosed_alphanum_sup", 279},
    __string_with_idx{"enclosed_alphanumeric_supplement", 279},
    __string_with_idx{"enclosed_alphanumerics", 83},
    __string_with_idx{"enclosed_cjk", 116},
    __string_with_idx{"enclosed_cjk_letters_and_months", 116},
    __string_with_idx{"enclosed_ideographic_sup", 280},
    __string_with_idx{"enclosed_ideographic_supplement", 280},
    __string_with_idx{"ethiopic", 38},
    __string_with_idx{"ethiopic_ext", 101},
    __string_with_idx{"ethiopic_ext_a", 143},
    __string_with_idx{"ethiopic_extended", 101},
    __string_with_idx{"ethiopic_extended_a", 143},
    __string_with_idx{"ethiopic_sup", 39},
    __string_with_idx{"ethiopic_supplement", 39},
    __string_with_idx{"general_punctuation", 72},
    __string_with_idx{"geometric_shapes", 86},
    __string_with_idx{"geometric_shapes_ext", 286},
    __string_with_idx{"geometric_shapes_extended", 286},
    __string_with_idx{"georgian", 36},
    __string_with_idx{"georgian_ext", 64},
    __string_with_idx{"georgian_extended", 64},
    __string_with_idx{"georgian_sup", 99},
    __string_with_idx{"georgian_supplement", 99},
    __string_with_idx{"glagolitic", 96},
    __string_with_idx{"glagolitic_sup", 268},
    __string_with_idx{"glagolitic_supplement", 268},
    __string_with_idx{"gothic", 174},
    __string_with_idx{"grantha", 219},
    __string_with_idx{"greek", 8},
    __string_with_idx{"greek_and_coptic", 8},
    __string_with_idx{"greek_ext", 71},
    __string_with_idx{"greek_extended", 71},
    __string_with_idx{"gujarati", 25},
    __string_with_idx{"gunjala_gondi", 236},
    __string_with_idx{"gurmukhi", 24},
    __string_with_idx{"half_and_full_forms", 162},
    __string_with_idx{"half_marks", 158},
    __string_with_idx{"halfwidth_and_fullwidth_forms", 162},
    __string_with_idx{"hangul", 147},
    __string_with_idx{"hangul_compatibility_jamo", 111},
    __string_with_idx{"hangul_jamo", 37},
    __string_with_idx{"hangul_jamo_extended_a", 136},
    __string_with_idx{"hangul_jamo_extended_b", 148},
    __string_with_idx{"hangul_syllables", 147},
    __string_with_idx{"hanifi_rohingya", 204},
    __string_with_idx{"hanunoo", 45},
    __string_with_idx{"hatran", 189},
    __string_with_idx{"hebrew", 12},
    __string_with_idx{"high_private_use_surrogates", 150},
    __string_with_idx{"high_pu_surrogates", 150},
    __string_with_idx{"high_surrogates", 149},
    __string_with_idx{"hiragana", 108},
    __string_with_idx{"idc", 106},
    __string_with_idx{"ideographic_description_characters", 106},
    __string_with_idx{"ideographic_symbols", 251},
    __string_with_idx{"ideographic_symbols_and_punctuation", 251},
    __string_with_idx{"imperial_aramaic", 186},
    __string_with_idx{"indic_number_forms", 130},
    __string_with_idx{"indic_siyaq_numbers", 273},
    __string_with_idx{"inscriptional_pahlavi", 200},
    __string_with_idx{"inscriptional_parthian", 199},
    __string_with_idx{"ipa_ext", 5},
    __string_with_idx{"ipa_extensions", 5},
    __string_with_idx{"jamo", 37},
    __string_with_idx{"jamo_ext_a", 136},
    __string_with_idx{"jamo_ext_b", 148},
    __string_with_idx{"javanese", 137},
    __string_with_idx{"kaithi", 210},
    __string_with_idx{"kana_ext_a", 255},
    __string_with_idx{"kana_extended_a", 255},
    __string_with_idx{"kana_sup", 254},
    __string_with_idx{"kana_supplement", 254},
    __string_with_idx{"kanbun", 112},
    __string_with_idx{"kangxi", 105},
    __string_with_idx{"kangxi_radicals", 105},
    __string_with_idx{"kannada", 29},
    __string_with_idx{"katakana", 109},
    __string_with_idx{"katakana_ext", 115},
    __string_with_idx{"katakana_phonetic_extensions", 115},
    __string_with_idx{"kayah_li", 134},
    __string_with_idx{"kharoshthi", 194},
    __string_with_idx{"khmer", 48},
    __string_with_idx{"khmer_symbols", 54},
    __string_with_idx{"khojki", 216},
    __string_with_idx{"khudawadi", 218},
    __string_with_idx{"lao", 33},
    __string_with_idx{"latin_1_sup", 2},
    __string_with_idx{"latin_1_supplement", 2},
    __string_with_idx{"latin_ext_a", 3},
    __string_with_idx{"latin_ext_additional", 70},
    __string_with_idx{"latin_ext_b", 4},
    __string_with_idx{"latin_ext_c", 97},
    __string_with_idx{"latin_ext_d", 128},
    __string_with_idx{"latin_ext_e", 144},
    __string_with_idx{"latin_extended_a", 3},
    __string_with_idx{"latin_extended_additional", 70},
    __string_with_idx{"latin_extended_b", 4},
    __string_with_idx{"latin_extended_c", 97},
    __string_with_idx{"latin_extended_d", 128},
    __string_with_idx{"latin_extended_e", 144},
    __string_with_idx{"lepcha", 61},
    __string_with_idx{"letterlike_symbols", 76},
    __string_with_idx{"limbu", 51},
    __string_with_idx{"linear_a", 184},
    __string_with_idx{"linear_b_ideograms", 165},
    __string_with_idx{"linear_b_syllabary", 164},
    __string_with_idx{"lisu", 123},
    __string_with_idx{"low_surrogates", 151},
    __string_with_idx{"lycian", 170},
    __string_with_idx{"lydian", 191},
    __string_with_idx{"mahajani", 213},
    __string_with_idx{"mahjong", 276},
    __string_with_idx{"mahjong_tiles", 276},
    __string_with_idx{"makasar", 237},
    __string_with_idx{"malayalam", 30},
    __string_with_idx{"mandaic", 19},
    __string_with_idx{"manichaean", 197},
    __string_with_idx{"marchen", 234},
    __string_with_idx{"masaram_gondi", 235},
    __string_with_idx{"math_alphanum", 266},
    __string_with_idx{"math_operators", 79},
    __string_with_idx{"mathematical_alphanumeric_symbols", 266},
    __string_with_idx{"mathematical_operators", 79},
    __string_with_idx{"mayan_numerals", 263},
    __string_with_idx{"medefaidrin", 249},
    __string_with_idx{"meetei_mayek", 146},
    __string_with_idx{"meetei_mayek_ext", 142},
    __string_with_idx{"meetei_mayek_extensions", 142},
    __string_with_idx{"mende_kikakui", 271},
    __string_with_idx{"meroitic_cursive", 193},
    __string_with_idx{"meroitic_hieroglyphs", 192},
    __string_with_idx{"miao", 250},
    __string_with_idx{"misc_arrows", 95},
    __string_with_idx{"misc_math_symbols_a", 89},
    __string_with_idx{"misc_math_symbols_b", 93},
    __string_with_idx{"misc_pictographs", 281},
    __string_with_idx{"misc_symbols", 87},
    __string_with_idx{"misc_technical", 80},
    __string_with_idx{"miscellaneous_mathematical_symbols_a", 89},
    __string_with_idx{"miscellaneous_mathematical_symbols_b", 93},
    __string_with_idx{"miscellaneous_symbols", 87},
    __string_with_idx{"miscellaneous_symbols_and_arrows", 95},
    __string_with_idx{"miscellaneous_symbols_and_pictographs", 281},
    __string_with_idx{"miscellaneous_technical", 80},
    __string_with_idx{"modi", 223},
    __string_with_idx{"modifier_letters", 6},
    __string_with_idx{"modifier_tone_letters", 127},
    __string_with_idx{"mongolian", 49},
    __string_with_idx{"mongolian_sup", 224},
    __string_with_idx{"mongolian_supplement", 224},
    __string_with_idx{"mro", 246},
    __string_with_idx{"multani", 217},
    __string_with_idx{"music", 261},
    __string_with_idx{"musical_symbols", 261},
    __string_with_idx{"myanmar", 35},
    __string_with_idx{"myanmar_ext_a", 140},
    __string_with_idx{"myanmar_ext_b", 138},
    __string_with_idx{"myanmar_extended_a", 140},
    __string_with_idx{"myanmar_extended_b", 138},
    __string_with_idx{"nabataean", 188},
    __string_with_idx{"nandinagari", 229},
    __string_with_idx{"nb", 0},
    __string_with_idx{"new_tai_lue", 53},
    __string_with_idx{"newa", 220},
    __string_with_idx{"nko", 17},
    __string_with_idx{"no_block", 0},
    __string_with_idx{"number_forms", 77},
    __string_with_idx{"nushu", 257},
    __string_with_idx{"nyiakeng_puachue_hmong", 269},
    __string_with_idx{"ocr", 82},
    __string_with_idx{"ogham", 42},
    __string_with_idx{"ol_chiki", 62},
    __string_with_idx{"old_hungarian", 203},
    __string_with_idx{"old_italic", 173},
    __string_with_idx{"old_north_arabian", 196},
    __string_with_idx{"old_permic", 175},
    __string_with_idx{"old_persian", 177},
    __string_with_idx{"old_sogdian", 206},
    __string_with_idx{"old_south_arabian", 195},
    __string_with_idx{"old_turkic", 202},
    __string_with_idx{"optical_character_recognition", 82},
    __string_with_idx{"oriya", 26},
    __string_with_idx{"ornamental_dingbats", 283},
    __string_with_idx{"osage", 181},
    __string_with_idx{"osmanya", 180},
    __string_with_idx{"ottoman_siyaq_numbers", 274},
    __string_with_idx{"pahawh_hmong", 248},
    __string_with_idx{"palmyrene", 187},
    __string_with_idx{"pau_cin_hau", 232},
    __string_with_idx{"phags_pa", 131},
    __string_with_idx{"phaistos", 169},
    __string_with_idx{"phaistos_disc", 169},
    __string_with_idx{"phoenician", 190},
    __string_with_idx{"phonetic_ext", 67},
    __string_with_idx{"phonetic_ext_sup", 68},
    __string_with_idx{"phonetic_extensions", 67},
    __string_with_idx{"phonetic_extensions_supplement", 68},
    __string_with_idx{"playing_cards", 278},
    __string_with_idx{"private_use_area", 152},
    __string_with_idx{"psalter_pahlavi", 201},
    __string_with_idx{"pua", 152},
    __string_with_idx{"punctuation", 72},
    __string_with_idx{"rejang", 135},
    __string_with_idx{"rumi", 205},
    __string_with_idx{"rumi_numeral_symbols", 205},
    __string_with_idx{"runic", 43},
    __string_with_idx{"samaritan", 18},
    __string_with_idx{"saurashtra", 132},
    __string_with_idx{"sharada", 214},
    __string_with_idx{"shavian", 179},
    __string_with_idx{"shorthand_format_controls", 259},
    __string_with_idx{"siddham", 222},
    __string_with_idx{"sinhala", 31},
    __string_with_idx{"sinhala_archaic_numbers", 215},
    __string_with_idx{"small_form_variants", 160},
    __string_with_idx{"small_forms", 160},
    __string_with_idx{"small_kana_ext", 256},
    __string_with_idx{"small_kana_extension", 256},
    __string_with_idx{"sogdian", 207},
    __string_with_idx{"sora_sompeng", 211},
    __string_with_idx{"soyombo", 231},
    __string_with_idx{"spacing_modifier_letters", 6},
    __string_with_idx{"specials", 163},
    __string_with_idx{"sundanese", 59},
    __string_with_idx{"sundanese_sup", 65},
    __string_with_idx{"sundanese_supplement", 65},
    __string_with_idx{"sup_arrows_a", 90},
    __string_with_idx{"sup_arrows_b", 92},
    __string_with_idx{"sup_arrows_c", 287},
    __string_with_idx{"sup_math_operators", 94},
    __string_with_idx{"sup_pua_a", 299},
    __string_with_idx{"sup_pua_b", 300},
    __string_with_idx{"sup_punctuation", 103},
    __string_with_idx{"sup_symbols_and_pictographs", 288},
    __string_with_idx{"super_and_sub", 73},
    __string_with_idx{"superscripts_and_subscripts", 73},
    __string_with_idx{"supplemental_arrows_a", 90},
    __string_with_idx{"supplemental_arrows_b", 92},
    __string_with_idx{"supplemental_arrows_c", 287},
    __string_with_idx{"supplemental_mathematical_operators", 94},
    __string_with_idx{"supplemental_punctuation", 103},
    __string_with_idx{"supplemental_symbols_and_pictographs", 288},
    __string_with_idx{"supplementary_private_use_area_a", 299},
    __string_with_idx{"supplementary_private_use_area_b", 300},
    __string_with_idx{"sutton_signwriting", 267},
    __string_with_idx{"syloti_nagri", 129},
    __string_with_idx{"symbols_and_pictographs_ext_a", 290},
    __string_with_idx{"symbols_and_pictographs_extended_a", 290},
    __string_with_idx{"syriac", 14},
    __string_with_idx{"syriac_sup", 20},
    __string_with_idx{"syriac_supplement", 20},
    __string_with_idx{"tagalog", 44},
    __string_with_idx{"tagbanwa", 47},
    __string_with_idx{"tags", 297},
    __string_with_idx{"tai_le", 52},
    __string_with_idx{"tai_tham", 56},
    __string_with_idx{"tai_viet", 141},
    __string_with_idx{"tai_xuan_jing", 264},
    __string_with_idx{"tai_xuan_jing_symbols", 264},
    __string_with_idx{"takri", 225},
    __string_with_idx{"tamil", 27},
    __string_with_idx{"tamil_sup", 238},
    __string_with_idx{"tamil_supplement", 238},
    __string_with_idx{"tangut", 252},
    __string_with_idx{"tangut_components", 253},
    __string_with_idx{"telugu", 28},
    __string_with_idx{"thaana", 16},
    __string_with_idx{"thai", 32},
    __string_with_idx{"tibetan", 34},
    __string_with_idx{"tifinagh", 100},
    __string_with_idx{"tirhuta", 221},
    __string_with_idx{"transport_and_map", 284},
    __string_with_idx{"transport_and_map_symbols", 284},
    __string_with_idx{"ucas", 41},
    __string_with_idx{"ucas_ext", 50},
    __string_with_idx{"ugaritic", 176},
    __string_with_idx{"unified_canadian_aboriginal_syllabics", 41},
    __string_with_idx{"unified_canadian_aboriginal_syllabics_extended", 50},
    __string_with_idx{"vai", 124},
    __string_with_idx{"variation_selectors", 156},
    __string_with_idx{"variation_selectors_supplement", 298},
    __string_with_idx{"vedic_ext", 66},
    __string_with_idx{"vedic_extensions", 66},
    __string_with_idx{"vertical_forms", 157},
    __string_with_idx{"vs", 156},
    __string_with_idx{"vs_sup", 298},
    __string_with_idx{"wancho", 270},
    __string_with_idx{"warang_citi", 228},
    __string_with_idx{"yi_radicals", 122},
    __string_with_idx{"yi_syllables", 121},
    __string_with_idx{"yijing", 119},
    __string_with_idx{"yijing_hexagram_symbols", 119},
    __string_with_idx{"zanabazar_square", 230}};
static constexpr const _compact_range __block_data = {
    0x00000001, 0x00008001, 0x00010001, 0x00018001, 0x00025001, 0x0002B001, 0x00030001, 0x00037001,
    0x00040001, 0x00050001, 0x00053001, 0x00059001, 0x00060001, 0x00070001, 0x00075001, 0x00078001,
    0x0007C001, 0x00080001, 0x00084001, 0x00086001, 0x00087000, 0x0008A002, 0x00090002, 0x00098002,
    0x000A0002, 0x000A8002, 0x000B0002, 0x000B8002, 0x000C0002, 0x000C8002, 0x000D0002, 0x000D8002,
    0x000E0002, 0x000E8002, 0x000F0002, 0x00100002, 0x0010A002, 0x00110002, 0x00120002, 0x00138002,
    0x0013A002, 0x00140002, 0x00168002, 0x0016A002, 0x00170002, 0x00172002, 0x00174002, 0x00176002,
    0x00178002, 0x00180002, 0x0018B002, 0x00190002, 0x00195002, 0x00198002, 0x0019E002, 0x001A0002,
    0x001A2002, 0x001AB002, 0x001B0002, 0x001B8002, 0x001BC002, 0x001C0002, 0x001C5002, 0x001C8002,
    0x001C9002, 0x001CC002, 0x001CD002, 0x001D0002, 0x001D8002, 0x001DC002, 0x001E0002, 0x001F0002,
    0x00200002, 0x00207002, 0x0020A002, 0x0020D002, 0x00210002, 0x00215002, 0x00219002, 0x00220002,
    0x00230002, 0x00240002, 0x00244002, 0x00246002, 0x00250002, 0x00258002, 0x0025A002, 0x00260002,
    0x00270002, 0x0027C002, 0x0027F002, 0x00280002, 0x00290002, 0x00298002, 0x002A0002, 0x002B0002,
    0x002C0002, 0x002C6002, 0x002C8002, 0x002D0002, 0x002D3002, 0x002D8002, 0x002DE002, 0x002E0002,
    0x002E8002, 0x002F0002, 0x002FE000, 0x002FF003, 0x00300003, 0x00304003, 0x0030A003, 0x00310003,
    0x00313003, 0x00319003, 0x0031A003, 0x0031C003, 0x0031F003, 0x00320003, 0x00330003, 0x00340003,
    0x004DC003, 0x004E0003, 0x00A00003, 0x00A49003, 0x00A4D003, 0x00A50003, 0x00A64003, 0x00A6A003,
    0x00A70003, 0x00A72003, 0x00A80003, 0x00A83003, 0x00A84003, 0x00A88003, 0x00A8E003, 0x00A90003,
    0x00A93003, 0x00A96003, 0x00A98003, 0x00A9E003, 0x00AA0003, 0x00AA6003, 0x00AA8003, 0x00AAE003,
    0x00AB0003, 0x00AB3003, 0x00AB7003, 0x00ABC003, 0x00AC0003, 0x00D7B003, 0x00D80003, 0x00DB8003,
    0x00DC0003, 0x00E00003, 0x00F90003, 0x00FB0003, 0x00FB5003, 0x00FE0003, 0x00FE1003, 0x00FE2003,
    0x00FE3003, 0x00FE5003, 0x00FE7003, 0x00FF0003, 0x00FFF003, 0x01000003, 0x01008003, 0x01010003,
    0x01014003, 0x01019003, 0x0101D003, 0x01020000, 0x01028004, 0x0102A004, 0x0102E004, 0x01030004,
    0x01033004, 0x01035004, 0x01038004, 0x0103A004, 0x0103E000, 0x01040005, 0x01045005, 0x01048005,
    0x0104B005, 0x01050005, 0x01053005, 0x01057000, 0x01060006, 0x01078000, 0x01080007, 0x01084007,
    0x01086007, 0x01088007, 0x0108B000, 0x0108E008, 0x01090008, 0x01092008, 0x01094000, 0x01098009,
    0x0109A009, 0x010A0009, 0x010A6009, 0x010A8009, 0x010AA000, 0x010AC00A, 0x010B000A, 0x010B400A,
    0x010B600A, 0x010B800A, 0x010BB000, 0x010C000B, 0x010C5000, 0x010C800C, 0x010D000C, 0x010D4000,
    0x010E600D, 0x010E8000, 0x010F000E, 0x010F300E, 0x010F7000, 0x010FE00F, 0x0110000F, 0x0110800F,
    0x0110D00F, 0x0111000F, 0x0111500F, 0x0111800F, 0x0111E00F, 0x0112000F, 0x01125000, 0x01128010,
    0x0112B010, 0x01130010, 0x01138000, 0x01140011, 0x01148011, 0x0114E000, 0x01158012, 0x01160012,
    0x01166012, 0x01168012, 0x0116D000, 0x01170013, 0x01174000, 0x01180014, 0x01185000, 0x0118A015,
    0x01190000, 0x0119A016, 0x011A0016, 0x011A5016, 0x011AB000, 0x011AC017, 0x011B0000, 0x011C0018,
    0x011C7018, 0x011CC000, 0x011D0019, 0x011D6019, 0x011DB000, 0x011EE01A, 0x011F0000, 0x011FC01B,
    0x0120001B, 0x0124001B, 0x0124801B, 0x01255000, 0x0130001C, 0x0134301C, 0x01344000, 0x0144001D,
    0x01468000, 0x0168001E, 0x016A401E, 0x016A7000, 0x016AD01F, 0x016B001F, 0x016B9000, 0x016E4020,
    0x016EA000, 0x016F0021, 0x016FA000, 0x016FE022, 0x01700022, 0x01880022, 0x018B0000, 0x01B00023,
    0x01B10023, 0x01B13023, 0x01B17023, 0x01B30000, 0x01BC0024, 0x01BCA024, 0x01BCB000, 0x01D00025,
    0x01D10025, 0x01D20025, 0x01D25000, 0x01D2E026, 0x01D30026, 0x01D36026, 0x01D38000, 0x01D40027,
    0x01D80027, 0x01DAB000, 0x01E00028, 0x01E03000, 0x01E10029, 0x01E15000, 0x01E2C02A, 0x01E30000,
    0x01E8002B, 0x01E8E000, 0x01E9002C, 0x01E96000, 0x01EC702D, 0x01ECC000, 0x01ED002E, 0x01ED5000,
    0x01EE002F, 0x01EF0000, 0x01F00030, 0x01F03030, 0x01F0A030, 0x01F10030, 0x01F20030, 0x01F30030,
    0x01F60030, 0x01F65030, 0x01F68030, 0x01F70030, 0x01F78030, 0x01F80030, 0x01F90030, 0x01FA0030,
    0x01FA7030, 0x01FB0000, 0x02000031, 0x02A6E000, 0x02A70032, 0x02B74032, 0x02B82032, 0x02CEB032,
    0x02EBF000, 0x02F80033, 0x02FA2000, 0x0E000034, 0x0E008000, 0x0E010035, 0x0E01F000, 0x0F000036,
    0x10000036};
enum class script {
    adlm,    // 0
    adlam = adlm,
    aghb,    // 1
    caucasian_albanian = aghb,
    ahom,    // 2
    arab,    // 3
    arabic = arab,
    armi,    // 4
    imperial_aramaic = armi,
    armn,    // 5
    armenian = armn,
    avst,    // 6
    avestan = avst,
    bali,    // 7
    balinese = bali,
    bamu,    // 8
    bamum = bamu,
    bass,    // 9
    bassa_vah = bass,
    batk,    // 10
    batak = batk,
    beng,    // 11
    bengali = beng,
    bhks,    // 12
    bhaiksuki = bhks,
    bopo,    // 13
    bopomofo = bopo,
    brah,    // 14
    brahmi = brah,
    brai,    // 15
    braille = brai,
    bugi,    // 16
    buginese = bugi,
    buhd,    // 17
    buhid = buhd,
    cakm,    // 18
    chakma = cakm,
    cans,    // 19
    canadian_aboriginal = cans,
    cari,    // 20
    carian = cari,
    cham,    // 21
    cher,    // 22
    cherokee = cher,
    copt,    // 23
    coptic = copt,
    cprt,    // 24
    cypriot = cprt,
    cyrl,    // 25
    cyrillic = cyrl,
    deva,    // 26
    devanagari = deva,
    dogr,    // 27
    dogra = dogr,
    dsrt,    // 28
    deseret = dsrt,
    dupl,    // 29
    duployan = dupl,
    egyp,    // 30
    egyptian_hieroglyphs = egyp,
    elba,    // 31
    elbasan = elba,
    elym,    // 32
    elymaic = elym,
    ethi,    // 33
    ethiopic = ethi,
    geor,    // 34
    georgian = geor,
    glag,    // 35
    glagolitic = glag,
    gong,    // 36
    gunjala_gondi = gong,
    gonm,    // 37
    masaram_gondi = gonm,
    goth,    // 38
    gothic = goth,
    gran,    // 39
    grantha = gran,
    grek,    // 40
    greek = grek,
    gujr,    // 41
    gujarati = gujr,
    guru,    // 42
    gurmukhi = guru,
    hang,    // 43
    hangul = hang,
    hani,    // 44
    han = hani,
    hano,    // 45
    hanunoo = hano,
    hatr,    // 46
    hatran = hatr,
    hebr,    // 47
    hebrew = hebr,
    hira,    // 48
    hiragana = hira,
    hluw,    // 49
    anatolian_hieroglyphs = hluw,
    hmng,    // 50
    pahawh_hmong = hmng,
    hmnp,    // 51
    nyiakeng_puachue_hmong = hmnp,
    hrkt,    // 52
    katakana_or_hiragana = hrkt,
    hung,    // 53
    old_hungarian = hung,
    ital,    // 54
    old_italic = ital,
    java,    // 55
    javanese = java,
    kali,    // 56
    kayah_li = kali,
    kana,    // 57
    katakana = kana,
    khar,    // 58
    kharoshthi = khar,
    khmr,    // 59
    khmer = khmr,
    khoj,    // 60
    khojki = khoj,
    knda,    // 61
    kannada = knda,
    kthi,    // 62
    kaithi = kthi,
    lana,    // 63
    tai_tham = lana,
    laoo,    // 64
    lao = laoo,
    latn,    // 65
    latin = latn,
    lepc,    // 66
    lepcha = lepc,
    limb,    // 67
    limbu = limb,
    lina,    // 68
    linear_a = lina,
    linb,    // 69
    linear_b = linb,
    lisu,    // 70
    lyci,    // 71
    lycian = lyci,
    lydi,    // 72
    lydian = lydi,
    mahj,    // 73
    mahajani = mahj,
    maka,    // 74
    makasar = maka,
    mand,    // 75
    mandaic = mand,
    mani,    // 76
    manichaean = mani,
    marc,    // 77
    marchen = marc,
    medf,    // 78
    medefaidrin = medf,
    mend,    // 79
    mende_kikakui = mend,
    merc,    // 80
    meroitic_cursive = merc,
    mero,    // 81
    meroitic_hieroglyphs = mero,
    mlym,    // 82
    malayalam = mlym,
    modi,    // 83
    mong,    // 84
    mongolian = mong,
    mroo,    // 85
    mro = mroo,
    mtei,    // 86
    meetei_mayek = mtei,
    mult,    // 87
    multani = mult,
    mymr,    // 88
    myanmar = mymr,
    nand,    // 89
    nandinagari = nand,
    narb,    // 90
    old_north_arabian = narb,
    nbat,    // 91
    nabataean = nbat,
    newa,    // 92
    nkoo,    // 93
    nko = nkoo,
    nshu,    // 94
    nushu = nshu,
    ogam,    // 95
    ogham = ogam,
    olck,    // 96
    ol_chiki = olck,
    orkh,    // 97
    old_turkic = orkh,
    orya,    // 98
    oriya = orya,
    osge,    // 99
    osage = osge,
    osma,    // 100
    osmanya = osma,
    palm,    // 101
    palmyrene = palm,
    pauc,    // 102
    pau_cin_hau = pauc,
    perm,    // 103
    old_permic = perm,
    phag,    // 104
    phags_pa = phag,
    phli,    // 105
    inscriptional_pahlavi = phli,
    phlp,    // 106
    psalter_pahlavi = phlp,
    phnx,    // 107
    phoenician = phnx,
    plrd,    // 108
    miao = plrd,
    prti,    // 109
    inscriptional_parthian = prti,
    rjng,    // 110
    rejang = rjng,
    rohg,    // 111
    hanifi_rohingya = rohg,
    runr,    // 112
    runic = runr,
    samr,    // 113
    samaritan = samr,
    sarb,    // 114
    old_south_arabian = sarb,
    saur,    // 115
    saurashtra = saur,
    sgnw,    // 116
    signwriting = sgnw,
    shaw,    // 117
    shavian = shaw,
    shrd,    // 118
    sharada = shrd,
    sidd,    // 119
    siddham = sidd,
    sind,    // 120
    khudawadi = sind,
    sinh,    // 121
    sinhala = sinh,
    sogd,    // 122
    sogdian = sogd,
    sogo,    // 123
    old_sogdian = sogo,
    sora,    // 124
    sora_sompeng = sora,
    soyo,    // 125
    soyombo = soyo,
    sund,    // 126
    sundanese = sund,
    sylo,    // 127
    syloti_nagri = sylo,
    syrc,    // 128
    syriac = syrc,
    tagb,    // 129
    tagbanwa = tagb,
    takr,    // 130
    takri = takr,
    tale,    // 131
    tai_le = tale,
    talu,    // 132
    new_tai_lue = talu,
    taml,    // 133
    tamil = taml,
    tang,    // 134
    tangut = tang,
    tavt,    // 135
    tai_viet = tavt,
    telu,    // 136
    telugu = telu,
    tfng,    // 137
    tifinagh = tfng,
    tglg,    // 138
    tagalog = tglg,
    thaa,    // 139
    thaana = thaa,
    thai,    // 140
    tibt,    // 141
    tibetan = tibt,
    tirh,    // 142
    tirhuta = tirh,
    ugar,    // 143
    ugaritic = ugar,
    vaii,    // 144
    vai = vaii,
    wara,    // 145
    warang_citi = wara,
    wcho,    // 146
    wancho = wcho,
    xpeo,    // 147
    old_persian = xpeo,
    xsux,    // 148
    cuneiform = xsux,
    yiii,    // 149
    yi = yiii,
    zanb,    // 150
    zanabazar_square = zanb,
    zinh,    // 151
    inherited = zinh,
    zyyy,    // 152
    common = zyyy,
    zzzz,    // 153
    unknown = zzzz,
    __max
};
static constexpr const std::array __scripts_names = {
    __string_with_idx{"adlam", 0},
    __string_with_idx{"adlm", 0},
    __string_with_idx{"aghb", 1},
    __string_with_idx{"ahom", 2},
    __string_with_idx{"anatolian_hieroglyphs", 49},
    __string_with_idx{"arab", 3},
    __string_with_idx{"arabic", 3},
    __string_with_idx{"armenian", 5},
    __string_with_idx{"armi", 4},
    __string_with_idx{"armn", 5},
    __string_with_idx{"avestan", 6},
    __string_with_idx{"avst", 6},
    __string_with_idx{"bali", 7},
    __string_with_idx{"balinese", 7},
    __string_with_idx{"bamu", 8},
    __string_with_idx{"bamum", 8},
    __string_with_idx{"bass", 9},
    __string_with_idx{"bassa_vah", 9},
    __string_with_idx{"batak", 10},
    __string_with_idx{"batk", 10},
    __string_with_idx{"beng", 11},
    __string_with_idx{"bengali", 11},
    __string_with_idx{"bhaiksuki", 12},
    __string_with_idx{"bhks", 12},
    __string_with_idx{"bopo", 13},
    __string_with_idx{"bopomofo", 13},
    __string_with_idx{"brah", 14},
    __string_with_idx{"brahmi", 14},
    __string_with_idx{"brai", 15},
    __string_with_idx{"braille", 15},
    __string_with_idx{"bugi", 16},
    __string_with_idx{"buginese", 16},
    __string_with_idx{"buhd", 17},
    __string_with_idx{"buhid", 17},
    __string_with_idx{"cakm", 18},
    __string_with_idx{"canadian_aboriginal", 19},
    __string_with_idx{"cans", 19},
    __string_with_idx{"cari", 20},
    __string_with_idx{"carian", 20},
    __string_with_idx{"caucasian_albanian", 1},
    __string_with_idx{"chakma", 18},
    __string_with_idx{"cham", 21},
    __string_with_idx{"cher", 22},
    __string_with_idx{"cherokee", 22},
    __string_with_idx{"common", 152},
    __string_with_idx{"copt", 23},
    __string_with_idx{"coptic", 23},
    __string_with_idx{"cprt", 24},
    __string_with_idx{"cuneiform", 148},
    __string_with_idx{"cypriot", 24},
    __string_with_idx{"cyrillic", 25},
    __string_with_idx{"cyrl", 25},
    __string_with_idx{"deseret", 28},
    __string_with_idx{"deva", 26},
    __string_with_idx{"devanagari", 26},
    __string_with_idx{"dogr", 27},
    __string_with_idx{"dogra", 27},
    __string_with_idx{"dsrt", 28},
    __string_with_idx{"dupl", 29},
    __string_with_idx{"duployan", 29},
    __string_with_idx{"egyp", 30},
    __string_with_idx{"egyptian_hieroglyphs", 30},
    __string_with_idx{"elba", 31},
    __string_with_idx{"elbasan", 31},
    __string_with_idx{"elym", 32},
    __string_with_idx{"elymaic", 32},
    __string_with_idx{"ethi", 33},
    __string_with_idx{"ethiopic", 33},
    __string_with_idx{"geor", 34},
    __string_with_idx{"georgian", 34},
    __string_with_idx{"glag", 35},
    __string_with_idx{"glagolitic", 35},
    __string_with_idx{"gong", 36},
    __string_with_idx{"gonm", 37},
    __string_with_idx{"goth", 38},
    __string_with_idx{"gothic", 38},
    __string_with_idx{"gran", 39},
    __string_with_idx{"grantha", 39},
    __string_with_idx{"greek", 40},
    __string_with_idx{"grek", 40},
    __string_with_idx{"gujarati", 41},
    __string_with_idx{"gujr", 41},
    __string_with_idx{"gunjala_gondi", 36},
    __string_with_idx{"gurmukhi", 42},
    __string_with_idx{"guru", 42},
    __string_with_idx{"han", 44},
    __string_with_idx{"hang", 43},
    __string_with_idx{"hangul", 43},
    __string_with_idx{"hani", 44},
    __string_with_idx{"hanifi_rohingya", 111},
    __string_with_idx{"hano", 45},
    __string_with_idx{"hanunoo", 45},
    __string_with_idx{"hatr", 46},
    __string_with_idx{"hatran", 46},
    __string_with_idx{"hebr", 47},
    __string_with_idx{"hebrew", 47},
    __string_with_idx{"hira", 48},
    __string_with_idx{"hiragana", 48},
    __string_with_idx{"hluw", 49},
    __string_with_idx{"hmng", 50},
    __string_with_idx{"hmnp", 51},
    __string_with_idx{"hrkt", 52},
    __string_with_idx{"hung", 53},
    __string_with_idx{"imperial_aramaic", 4},
    __string_with_idx{"inherited", 151},
    __string_with_idx{"inscriptional_pahlavi", 105},
    __string_with_idx{"inscriptional_parthian", 109},
    __string_with_idx{"ital", 54},
    __string_with_idx{"java", 55},
    __string_with_idx{"javanese", 55},
    __string_with_idx{"kaithi", 62},
    __string_with_idx{"kali", 56},
    __string_with_idx{"kana", 57},
    __string_with_idx{"kannada", 61},
    __string_with_idx{"katakana", 57},
    __string_with_idx{"katakana_or_hiragana", 52},
    __string_with_idx{"kayah_li", 56},
    __string_with_idx{"khar", 58},
    __string_with_idx{"kharoshthi", 58},
    __string_with_idx{"khmer", 59},
    __string_with_idx{"khmr", 59},
    __string_with_idx{"khoj", 60},
    __string_with_idx{"khojki", 60},
    __string_with_idx{"khudawadi", 120},
    __string_with_idx{"knda", 61},
    __string_with_idx{"kthi", 62},
    __string_with_idx{"lana", 63},
    __string_with_idx{"lao", 64},
    __string_with_idx{"laoo", 64},
    __string_with_idx{"latin", 65},
    __string_with_idx{"latn", 65},
    __string_with_idx{"lepc", 66},
    __string_with_idx{"lepcha", 66},
    __string_with_idx{"limb", 67},
    __string_with_idx{"limbu", 67},
    __string_with_idx{"lina", 68},
    __string_with_idx{"linb", 69},
    __string_with_idx{"linear_a", 68},
    __string_with_idx{"linear_b", 69},
    __string_with_idx{"lisu", 70},
    __string_with_idx{"lyci", 71},
    __string_with_idx{"lycian", 71},
    __string_with_idx{"lydi", 72},
    __string_with_idx{"lydian", 72},
    __string_with_idx{"mahajani", 73},
    __string_with_idx{"mahj", 73},
    __string_with_idx{"maka", 74},
    __string_with_idx{"makasar", 74},
    __string_with_idx{"malayalam", 82},
    __string_with_idx{"mand", 75},
    __string_with_idx{"mandaic", 75},
    __string_with_idx{"mani", 76},
    __string_with_idx{"manichaean", 76},
    __string_with_idx{"marc", 77},
    __string_with_idx{"marchen", 77},
    __string_with_idx{"masaram_gondi", 37},
    __string_with_idx{"medefaidrin", 78},
    __string_with_idx{"medf", 78},
    __string_with_idx{"meetei_mayek", 86},
    __string_with_idx{"mend", 79},
    __string_with_idx{"mende_kikakui", 79},
    __string_with_idx{"merc", 80},
    __string_with_idx{"mero", 81},
    __string_with_idx{"meroitic_cursive", 80},
    __string_with_idx{"meroitic_hieroglyphs", 81},
    __string_with_idx{"miao", 108},
    __string_with_idx{"mlym", 82},
    __string_with_idx{"modi", 83},
    __string_with_idx{"mong", 84},
    __string_with_idx{"mongolian", 84},
    __string_with_idx{"mro", 85},
    __string_with_idx{"mroo", 85},
    __string_with_idx{"mtei", 86},
    __string_with_idx{"mult", 87},
    __string_with_idx{"multani", 87},
    __string_with_idx{"myanmar", 88},
    __string_with_idx{"mymr", 88},
    __string_with_idx{"nabataean", 91},
    __string_with_idx{"nand", 89},
    __string_with_idx{"nandinagari", 89},
    __string_with_idx{"narb", 90},
    __string_with_idx{"nbat", 91},
    __string_with_idx{"new_tai_lue", 132},
    __string_with_idx{"newa", 92},
    __string_with_idx{"nko", 93},
    __string_with_idx{"nkoo", 93},
    __string_with_idx{"nshu", 94},
    __string_with_idx{"nushu", 94},
    __string_with_idx{"nyiakeng_puachue_hmong", 51},
    __string_with_idx{"ogam", 95},
    __string_with_idx{"ogham", 95},
    __string_with_idx{"ol_chiki", 96},
    __string_with_idx{"olck", 96},
    __string_with_idx{"old_hungarian", 53},
    __string_with_idx{"old_italic", 54},
    __string_with_idx{"old_north_arabian", 90},
    __string_with_idx{"old_permic", 103},
    __string_with_idx{"old_persian", 147},
    __string_with_idx{"old_sogdian", 123},
    __string_with_idx{"old_south_arabian", 114},
    __string_with_idx{"old_turkic", 97},
    __string_with_idx{"oriya", 98},
    __string_with_idx{"orkh", 97},
    __string_with_idx{"orya", 98},
    __string_with_idx{"osage", 99},
    __string_with_idx{"osge", 99},
    __string_with_idx{"osma", 100},
    __string_with_idx{"osmanya", 100},
    __string_with_idx{"pahawh_hmong", 50},
    __string_with_idx{"palm", 101},
    __string_with_idx{"palmyrene", 101},
    __string_with_idx{"pau_cin_hau", 102},
    __string_with_idx{"pauc", 102},
    __string_with_idx{"perm", 103},
    __string_with_idx{"phag", 104},
    __string_with_idx{"phags_pa", 104},
    __string_with_idx{"phli", 105},
    __string_with_idx{"phlp", 106},
    __string_with_idx{"phnx", 107},
    __string_with_idx{"phoenician", 107},
    __string_with_idx{"plrd", 108},
    __string_with_idx{"prti", 109},
    __string_with_idx{"psalter_pahlavi", 106},
    __string_with_idx{"rejang", 110},
    __string_with_idx{"rjng", 110},
    __string_with_idx{"rohg", 111},
    __string_with_idx{"runic", 112},
    __string_with_idx{"runr", 112},
    __string_with_idx{"samaritan", 113},
    __string_with_idx{"samr", 113},
    __string_with_idx{"sarb", 114},
    __string_with_idx{"saur", 115},
    __string_with_idx{"saurashtra", 115},
    __string_with_idx{"sgnw", 116},
    __string_with_idx{"sharada", 118},
    __string_with_idx{"shavian", 117},
    __string_with_idx{"shaw", 117},
    __string_with_idx{"shrd", 118},
    __string_with_idx{"sidd", 119},
    __string_with_idx{"siddham", 119},
    __string_with_idx{"signwriting", 116},
    __string_with_idx{"sind", 120},
    __string_with_idx{"sinh", 121},
    __string_with_idx{"sinhala", 121},
    __string_with_idx{"sogd", 122},
    __string_with_idx{"sogdian", 122},
    __string_with_idx{"sogo", 123},
    __string_with_idx{"sora", 124},
    __string_with_idx{"sora_sompeng", 124},
    __string_with_idx{"soyo", 125},
    __string_with_idx{"soyombo", 125},
    __string_with_idx{"sund", 126},
    __string_with_idx{"sundanese", 126},
    __string_with_idx{"sylo", 127},
    __string_with_idx{"syloti_nagri", 127},
    __string_with_idx{"syrc", 128},
    __string_with_idx{"syriac", 128},
    __string_with_idx{"tagalog", 138},
    __string_with_idx{"tagb", 129},
    __string_with_idx{"tagbanwa", 129},
    __string_with_idx{"tai_le", 131},
    __string_with_idx{"tai_tham", 63},
    __string_with_idx{"tai_viet", 135},
    __string_with_idx{"takr", 130},
    __string_with_idx{"takri", 130},
    __string_with_idx{"tale", 131},
    __string_with_idx{"talu", 132},
    __string_with_idx{"tamil", 133},
    __string_with_idx{"taml", 133},
    __string_with_idx{"tang", 134},
    __string_with_idx{"tangut", 134},
    __string_with_idx{"tavt", 135},
    __string_with_idx{"telu", 136},
    __string_with_idx{"telugu", 136},
    __string_with_idx{"tfng", 137},
    __string_with_idx{"tglg", 138},
    __string_with_idx{"thaa", 139},
    __string_with_idx{"thaana", 139},
    __string_with_idx{"thai", 140},
    __string_with_idx{"tibetan", 141},
    __string_with_idx{"tibt", 141},
    __string_with_idx{"tifinagh", 137},
    __string_with_idx{"tirh", 142},
    __string_with_idx{"tirhuta", 142},
    __string_with_idx{"ugar", 143},
    __string_with_idx{"ugaritic", 143},
    __string_with_idx{"unknown", 153},
    __string_with_idx{"vai", 144},
    __string_with_idx{"vaii", 144},
    __string_with_idx{"wancho", 146},
    __string_with_idx{"wara", 145},
    __string_with_idx{"warang_citi", 145},
    __string_with_idx{"wcho", 146},
    __string_with_idx{"xpeo", 147},
    __string_with_idx{"xsux", 148},
    __string_with_idx{"yi", 149},
    __string_with_idx{"yiii", 149},
    __string_with_idx{"zanabazar_square", 150},
    __string_with_idx{"zanb", 150},
    __string_with_idx{"zinh", 151},
    __string_with_idx{"zyyy", 152},
    __string_with_idx{"zzzz", 153}};
template<auto N>
struct __script_data;
template<>
struct __script_data<0> {
    static constexpr const _compact_range scripts_data = {
        0x00000098, 0x00004141, 0x00005B98, 0x00006141, 0x00007B98, 0x0000AA41, 0x0000AB98,
        0x0000BA41, 0x0000BB98, 0x0000C041, 0x0000D798, 0x0000D841, 0x0000F798, 0x0000F841,
        0x0002B998, 0x0002E041, 0x0002E598, 0x0002EA0D, 0x0002EC98, 0x00030097, 0x00037028,
        0x00037498, 0x00037528, 0x00037899, 0x00037A28, 0x00037E98, 0x00037F28, 0x00038099,
        0x00038428, 0x00038598, 0x00038628, 0x00038798, 0x00038828, 0x00038B99, 0x00038C28,
        0x00038D99, 0x00038E28, 0x0003A299, 0x0003A328, 0x0003E217, 0x0003F028, 0x00040019,
        0x00048597, 0x00048719, 0x00053099, 0x00053105, 0x00055799, 0x00055905, 0x00058998,
        0x00058A05, 0x00058B99, 0x00058D05, 0x00059099, 0x0005912F, 0x0005C899, 0x0005D02F,
        0x0005EB99, 0x0005EF2F, 0x0005F599, 0x00060003, 0x00060598, 0x00060603, 0x00060C98,
        0x00060D03, 0x00061B98, 0x00061C03, 0x00061D99, 0x00061E03, 0x00061F98, 0x00062003,
        0x00064098, 0x00064103, 0x00064B97, 0x00065603, 0x00067097, 0x00067103, 0x0006DD98,
        0x0006DE03, 0x00070080, 0x00070E99, 0x00070F80, 0x00074B99, 0x00074D80, 0x00075003,
        0x0007808B, 0x0007B299, 0x0007C05D, 0x0007FB99, 0x0007FD5D, 0x00080071, 0x00082E99,
        0x00083071, 0x00083F99, 0x0008404B, 0x00085C99, 0x00085E4B, 0x00085F99, 0x00086080,
        0x00086B99, 0x0008A003, 0x0008B599, 0x0008B603, 0x0008BE99, 0x0008D303, 0x0008E298,
        0x0008E303, 0x0009001A, 0x00095197, 0x0009551A, 0x00096498, 0x0009661A, 0x0009800B,
        0x00098499, 0x0009850B, 0x00098D99, 0x00098F0B, 0x00099199, 0x0009930B, 0x0009A999,
        0x0009AA0B, 0x0009B199, 0x0009B20B, 0x0009B399, 0x0009B60B, 0x0009BA99, 0x0009BC0B,
        0x0009C599, 0x0009C70B, 0x0009C999, 0x0009CB0B, 0x0009CF99, 0x0009D70B, 0x0009D899,
        0x0009DC0B, 0x0009DE99, 0x0009DF0B, 0x0009E499, 0x0009E60B, 0x0009FF99, 0x000A012A,
        0x000A0499, 0x000A052A, 0x000A0B99, 0x000A0F2A, 0x000A1199, 0x000A132A, 0x000A2999,
        0x000A2A2A, 0x000A3199, 0x000A322A, 0x000A3499, 0x000A352A, 0x000A3799, 0x000A382A,
        0x000A3A99, 0x000A3C2A, 0x000A3D99, 0x000A3E2A, 0x000A4399, 0x000A472A, 0x000A4999,
        0x000A4B2A, 0x000A4E99, 0x000A512A, 0x000A5299, 0x000A592A, 0x000A5D99, 0x000A5E2A,
        0x000A5F99, 0x000A662A, 0x000A7799, 0x000A8129, 0x000A8499, 0x000A8529, 0x000A8E99,
        0x000A8F29, 0x000A9299, 0x000A9329, 0x000AA999, 0x000AAA29, 0x000AB199, 0x000AB229,
        0x000AB499, 0x000AB529, 0x000ABA99, 0x000ABC29, 0x000AC699, 0x000AC729, 0x000ACA99,
        0x000ACB29, 0x000ACE99, 0x000AD029, 0x000AD199, 0x000AE029, 0x000AE499, 0x000AE629,
        0x000AF299, 0x000AF929, 0x000B0099, 0x000B0162, 0x000B0499, 0x000B0562, 0x000B0D99,
        0x000B0F62, 0x000B1199, 0x000B1362, 0x000B2999, 0x000B2A62, 0x000B3199, 0x000B3262,
        0x000B3499, 0x000B3562, 0x000B3A99, 0x000B3C62, 0x000B4599, 0x000B4762, 0x000B4999,
        0x000B4B62, 0x000B4E99, 0x000B5662, 0x000B5899, 0x000B5C62, 0x000B5E99, 0x000B5F62,
        0x000B6499, 0x000B6662, 0x000B7899, 0x000B8285, 0x000B8499, 0x000B8585, 0x000B8B99,
        0x000B8E85, 0x000B9199, 0x000B9285, 0x000B9699, 0x000B9985, 0x000B9B99, 0x000B9C85,
        0x000B9D99, 0x000B9E85, 0x000BA099, 0x000BA385, 0x000BA599, 0x000BA885, 0x000BAB99,
        0x000BAE85, 0x000BBA99, 0x000BBE85, 0x000BC399, 0x000BC685, 0x000BC999, 0x000BCA85,
        0x000BCE99, 0x000BD085, 0x000BD199, 0x000BD785, 0x000BD899, 0x000BE685, 0x000BFB99,
        0x000C0088, 0x000C0D99, 0x000C0E88, 0x000C1199, 0x000C1288, 0x000C2999, 0x000C2A88,
        0x000C3A99, 0x000C3D88, 0x000C4599, 0x000C4688, 0x000C4999, 0x000C4A88, 0x000C4E99,
        0x000C5588, 0x000C5799, 0x000C5888, 0x000C5B99, 0x000C6088, 0x000C6499, 0x000C6688,
        0x000C7099, 0x000C7788, 0x000C803D, 0x000C8D99, 0x000C8E3D, 0x000C9199, 0x000C923D,
        0x000CA999, 0x000CAA3D, 0x000CB499, 0x000CB53D, 0x000CBA99, 0x000CBC3D, 0x000CC599,
        0x000CC63D, 0x000CC999, 0x000CCA3D, 0x000CCE99, 0x000CD53D, 0x000CD799, 0x000CDE3D,
        0x000CDF99, 0x000CE03D, 0x000CE499, 0x000CE63D, 0x000CF099, 0x000CF13D, 0x000CF399,
        0x000D0052, 0x000D0499, 0x000D0552, 0x000D0D99, 0x000D0E52, 0x000D1199, 0x000D1252,
        0x000D4599, 0x000D4652, 0x000D4999, 0x000D4A52, 0x000D5099, 0x000D5452, 0x000D6499,
        0x000D6652, 0x000D8099, 0x000D8279, 0x000D8499, 0x000D8579, 0x000D9799, 0x000D9A79,
        0x000DB299, 0x000DB379, 0x000DBC99, 0x000DBD79, 0x000DBE99, 0x000DC079, 0x000DC799,
        0x000DCA79, 0x000DCB99, 0x000DCF79, 0x000DD599, 0x000DD679, 0x000DD799, 0x000DD879,
        0x000DE099, 0x000DE679, 0x000DF099, 0x000DF279, 0x000DF599, 0x000E018C, 0x000E3B99,
        0x000E3F98, 0x000E408C, 0x000E5C99, 0x000E8140, 0x000E8399, 0x000E8440, 0x000E8599,
        0x000E8640, 0x000E8B99, 0x000E8C40, 0x000EA499, 0x000EA540, 0x000EA699, 0x000EA740,
        0x000EBE99, 0x000EC040, 0x000EC599, 0x000EC640, 0x000EC799, 0x000EC840, 0x000ECE99,
        0x000ED040, 0x000EDA99, 0x000EDC40, 0x000EE099, 0x000F008D, 0x000F4899, 0x000F498D,
        0x000F6D99, 0x000F718D, 0x000F9899, 0x000F998D, 0x000FBD99, 0x000FBE8D, 0x000FCD99,
        0x000FCE8D, 0x000FD598, 0x000FD98D, 0x000FDB99, 0x00100058, 0x0010A022, 0x0010C699,
        0x0010C722, 0x0010C899, 0x0010CD22, 0x0010CE99, 0x0010D022, 0x0010FB98, 0x0010FC22,
        0x0011002B, 0x00120021, 0x00124999, 0x00124A21, 0x00124E99, 0x00125021, 0x00125799,
        0x00125821, 0x00125999, 0x00125A21, 0x00125E99, 0x00126021, 0x00128999, 0x00128A21,
        0x00128E99, 0x00129021, 0x0012B199, 0x0012B221, 0x0012B699, 0x0012B821, 0x0012BF99,
        0x0012C021, 0x0012C199, 0x0012C221, 0x0012C699, 0x0012C821, 0x0012D799, 0x0012D821,
        0x00131199, 0x00131221, 0x00131699, 0x00131821, 0x00135B99, 0x00135D21, 0x00137D99,
        0x00138021, 0x00139A99, 0x0013A016, 0x0013F699, 0x0013F816, 0x0013FE99, 0x00140013,
        0x0016805F, 0x00169D99, 0x0016A070, 0x0016EB98, 0x0016EE70, 0x0016F999, 0x0017008A,
        0x00170D99, 0x00170E8A, 0x00171599, 0x0017202D, 0x00173598, 0x00173799, 0x00174011,
        0x00175499, 0x00176081, 0x00176D99, 0x00176E81, 0x00177199, 0x00177281, 0x00177499,
        0x0017803B, 0x0017DE99, 0x0017E03B, 0x0017EA99, 0x0017F03B, 0x0017FA99, 0x00180054,
        0x00180298, 0x00180454, 0x00180598, 0x00180654, 0x00180F99, 0x00181054, 0x00181A99,
        0x00182054, 0x00187999, 0x00188054, 0x0018AB99, 0x0018B013, 0x0018F699, 0x00190043,
        0x00191F99, 0x00192043, 0x00192C99, 0x00193043, 0x00193C99, 0x00194043, 0x00194199,
        0x00194443, 0x00195083, 0x00196E99, 0x00197083, 0x00197599, 0x00198084, 0x0019AC99,
        0x0019B084, 0x0019CA99, 0x0019D084, 0x0019DB99, 0x0019DE84, 0x0019E03B, 0x001A0010,
        0x001A1C99, 0x001A1E10, 0x001A203F, 0x001A5F99, 0x001A603F, 0x001A7D99, 0x001A7F3F,
        0x001A8A99, 0x001A903F, 0x001A9A99, 0x001AA03F, 0x001AAE99, 0x001AB097, 0x001ABF99,
        0x001B0007, 0x001B4C99, 0x001B5007, 0x001B7D99, 0x001B807E, 0x001BC00A, 0x001BF499,
        0x001BFC0A, 0x001C0042, 0x001C3899, 0x001C3B42, 0x001C4A99, 0x001C4D42, 0x001C5060,
        0x001C8019, 0x001C8999, 0x001C9022, 0x001CBB99, 0x001CBD22, 0x001CC07E, 0x001CC899,
        0x001CD097, 0x001CD398, 0x001CD497, 0x001CE198, 0x001CE297, 0x001CE998, 0x001CED97,
        0x001CEE98, 0x001CF497, 0x001CF598, 0x001CF897, 0x001CFA98, 0x001CFB99, 0x001D0041,
        0x001D2628, 0x001D2B19, 0x001D2C41, 0x001D5D28, 0x001D6241, 0x001D6628, 0x001D6B41,
        0x001D7819, 0x001D7941, 0x001DBF28, 0x001DC097, 0x001DFA99, 0x001DFB97, 0x001E0041,
        0x001F0028, 0x001F1699, 0x001F1828, 0x001F1E99, 0x001F2028, 0x001F4699, 0x001F4828,
        0x001F4E99, 0x001F5028, 0x001F5899, 0x001F5928, 0x001F5A99, 0x001F5B28, 0x001F5C99,
        0x001F5D28, 0x001F5E99, 0x001F5F28, 0x001F7E99, 0x001F8028, 0x001FB599, 0x001FB628,
        0x001FC599, 0x001FC628, 0x001FD499, 0x001FD628, 0x001FDC99, 0x001FDD28, 0x001FF099,
        0x001FF228, 0x001FF599, 0x001FF628, 0x001FFF99, 0x00200098, 0x00200C97, 0x00200E98,
        0x00206599, 0x00206698, 0x00207141, 0x00207299, 0x00207498, 0x00207F41, 0x00208098,
        0x00208F99, 0x00209041, 0x00209D99, 0x0020A098, 0x0020C099, 0x0020D097, 0x0020F199,
        0x00210098, 0x00212628, 0x00212798, 0x00212A41, 0x00212C98, 0x00213241, 0x00213398,
        0x00214E41, 0x00214F98, 0x00216041, 0x00218998, 0x00218C99, 0x00219098, 0x00242799,
        0x00244098, 0x00244B99, 0x00246098, 0x0028000F, 0x00290098, 0x002B7499, 0x002B7698,
        0x002B9699, 0x002B9898, 0x002C0023, 0x002C2F99, 0x002C3023, 0x002C5F99, 0x002C6041,
        0x002C8017, 0x002CF499, 0x002CF917, 0x002D0022, 0x002D2699, 0x002D2722, 0x002D2899,
        0x002D2D22, 0x002D2E99, 0x002D3089, 0x002D6899, 0x002D6F89, 0x002D7199, 0x002D7F89,
        0x002D8021, 0x002D9799, 0x002DA021, 0x002DA799, 0x002DA821, 0x002DAF99, 0x002DB021,
        0x002DB799, 0x002DB821, 0x002DBF99, 0x002DC021, 0x002DC799, 0x002DC821, 0x002DCF99,
        0x002DD021, 0x002DD799, 0x002DD821, 0x002DDF99, 0x002DE019, 0x002E0098, 0x002E5099,
        0x002E802C, 0x002E9A99, 0x002E9B2C, 0x002EF499, 0x002F002C, 0x002FD699, 0x002FF098,
        0x002FFC99, 0x00300098, 0x0030052C, 0x00300698, 0x0030072C, 0x00300898, 0x0030212C,
        0x00302A97, 0x00302E2B, 0x00303098, 0x0030382C, 0x00303C98, 0x00304099, 0x00304130,
        0x00309799, 0x00309997, 0x00309B98, 0x00309D30, 0x0030A098, 0x0030A139, 0x0030FB98,
        0x0030FD39, 0x00310099, 0x0031050D, 0x00313099, 0x0031312B, 0x00318F99, 0x00319098,
        0x0031A00D, 0x0031BB99, 0x0031C098, 0x0031E499, 0x0031F039, 0x0032002B, 0x00321F99,
        0x00322098, 0x0032602B, 0x00327F98, 0x0032D039, 0x0032FF99, 0x00330039, 0x00335898,
        0x00340099, 0x0034032C, 0x00340499, 0x0034052C, 0x00340699, 0x0034812C, 0x00348299,
        0x0034832C, 0x00348499, 0x0038282C, 0x00382999, 0x00382A2C, 0x00382B99, 0x003B4B2C,
        0x003B4C99, 0x003B4D2C, 0x003B4E99, 0x004DB42C, 0x004DB599, 0x004DC098, 0x004E002C,
        0x004E0299, 0x004E032C, 0x004E0499, 0x004E052C, 0x004E0699, 0x004E072C, 0x004E0A99,
        0x004E5B2C, 0x004E5C99, 0x004E5D2C, 0x004E5E99, 0x004E8A2C, 0x004E8B99, 0x004E8C2C,
        0x004E8D99, 0x004E922C, 0x004E9399, 0x004E942C, 0x004E9799, 0x004EBD2C, 0x004EBE99,
        0x004EBF2C, 0x004EC199, 0x004EDD2C, 0x004EDE99, 0x004EDF2C, 0x004EE099, 0x004EE62C,
        0x004EE799, 0x004EE82C, 0x004EE999, 0x004F0B2C, 0x004F0C99, 0x004F0D2C, 0x004F0E99,
        0x004F6E2C, 0x004F6F99, 0x004F702C, 0x004F7199, 0x0051022C, 0x00510399, 0x0051042C,
        0x00510599, 0x0051442C, 0x00514599, 0x0051462C, 0x00514799, 0x0051672C, 0x00516899,
        0x0051692C, 0x00516E99, 0x00533F2C, 0x00534099, 0x0053412C, 0x00534699, 0x00534A2C,
        0x00534B99, 0x00534C2C, 0x00534D99, 0x0053BF2C, 0x0053C099, 0x0053C12C, 0x0053C599,
        0x0056D92C, 0x0056DA99, 0x0056DB2C, 0x0056DC99, 0x0058EF2C, 0x0058F099, 0x0058F12C,
        0x0058F299, 0x0058F72C, 0x0058F899, 0x0058F92C, 0x0058FA99, 0x005E782C, 0x005E7999,
        0x005E7A2C, 0x005E7B99, 0x005EFC2C, 0x005EFD99, 0x005EFE2C, 0x005F0099, 0x005F0A2C,
        0x005F0B99, 0x005F0C2C, 0x005F1199, 0x0062FC2C, 0x0062FD99, 0x0062FE2C, 0x0062FF99,
        0x00634A2C, 0x00634B99, 0x00634C2C, 0x00634D99, 0x0067D02C, 0x0067D199, 0x0067D22C,
        0x0067D399, 0x006F042C, 0x006F0599, 0x006F062C, 0x006F0799, 0x0073942C, 0x00739599,
        0x0073962C, 0x00739799, 0x00767C2C, 0x00767D99, 0x00767E2C, 0x00767F99, 0x0080842C,
        0x00808599, 0x0080862C, 0x00808799, 0x00842A2C, 0x00842B99, 0x00842C2C, 0x00842D99,
        0x008CAC2C, 0x008CAD99, 0x008CAE2C, 0x008CAF99, 0x008CB12C, 0x008CB299, 0x008CB32C,
        0x008CB499, 0x008D2E2C, 0x008D2F99, 0x008D302C, 0x008D3199, 0x00961F2C, 0x00962099,
        0x0096212C, 0x00962299, 0x0096442C, 0x00964599, 0x0096462C, 0x00964799, 0x00964A2C,
        0x00964B99, 0x00964C2C, 0x00964D99, 0x0096762C, 0x00967799, 0x0096782C, 0x00967999,
        0x0096F42C, 0x0096F599, 0x0096F62C, 0x0096F799, 0x009FA42C, 0x009FA599, 0x009FBA2C,
        0x009FBB99, 0x009FC22C, 0x009FC399, 0x009FCA2C, 0x009FCB99, 0x009FCC2C, 0x009FCD99,
        0x009FD42C, 0x009FD599, 0x009FE92C, 0x009FEA99, 0x009FEE2C, 0x009FEF99, 0x00A00095,
        0x00A48D99, 0x00A49095, 0x00A4C799, 0x00A4D046, 0x00A50090, 0x00A62C99, 0x00A64019,
        0x00A6A008, 0x00A6F899, 0x00A70098, 0x00A72241, 0x00A78898, 0x00A78B41, 0x00A7C099,
        0x00A7C241, 0x00A7C799, 0x00A7F741, 0x00A8007F, 0x00A82C99, 0x00A83098, 0x00A83A99,
        0x00A84068, 0x00A87899, 0x00A88073, 0x00A8C699, 0x00A8CE73, 0x00A8DA99, 0x00A8E01A,
        0x00A90038, 0x00A92E98, 0x00A92F38, 0x00A9306E, 0x00A95499, 0x00A95F6E, 0x00A9602B,
        0x00A97D99, 0x00A98037, 0x00A9CE99, 0x00A9CF98, 0x00A9D037, 0x00A9DA99, 0x00A9DE37,
        0x00A9E058, 0x00A9FF99, 0x00AA0015, 0x00AA3799, 0x00AA4015, 0x00AA4E99, 0x00AA5015,
        0x00AA5A99, 0x00AA5C15, 0x00AA6058, 0x00AA8087, 0x00AAC399, 0x00AADB87, 0x00AAE056,
        0x00AAF799, 0x00AB0121, 0x00AB0799, 0x00AB0921, 0x00AB0F99, 0x00AB1121, 0x00AB1799,
        0x00AB2021, 0x00AB2799, 0x00AB2821, 0x00AB2F99, 0x00AB3041, 0x00AB5B98, 0x00AB5C41,
        0x00AB6528, 0x00AB6641, 0x00AB6899, 0x00AB7016, 0x00ABC056, 0x00ABEE99, 0x00ABF056,
        0x00ABFA99, 0x00AC002B, 0x00D7A499, 0x00D7B02B, 0x00D7C799, 0x00D7CB2B, 0x00D7FC99,
        0x00F9002C, 0x00FA6E99, 0x00FA702C, 0x00FADA99, 0x00FB0041, 0x00FB0799, 0x00FB1305,
        0x00FB1899, 0x00FB1D2F, 0x00FB3799, 0x00FB382F, 0x00FB3D99, 0x00FB3E2F, 0x00FB3F99,
        0x00FB402F, 0x00FB4299, 0x00FB432F, 0x00FB4599, 0x00FB462F, 0x00FB5003, 0x00FBC299,
        0x00FBD303, 0x00FD3E98, 0x00FD4099, 0x00FD5003, 0x00FD9099, 0x00FD9203, 0x00FDC899,
        0x00FDF003, 0x00FDFE99, 0x00FE0097, 0x00FE1098, 0x00FE1A99, 0x00FE2097, 0x00FE2E19,
        0x00FE3098, 0x00FE5399, 0x00FE5498, 0x00FE6799, 0x00FE6898, 0x00FE6C99, 0x00FE7003,
        0x00FE7599, 0x00FE7603, 0x00FEFD99, 0x00FEFF98, 0x00FF0099, 0x00FF0198, 0x00FF2141,
        0x00FF3B98, 0x00FF4141, 0x00FF5B98, 0x00FF6639, 0x00FF7098, 0x00FF7139, 0x00FF9E98,
        0x00FFA02B, 0x00FFBF99, 0x00FFC22B, 0x00FFC899, 0x00FFCA2B, 0x00FFD099, 0x00FFD22B,
        0x00FFD899, 0x00FFDA2B, 0x00FFDD99, 0x00FFE098, 0x00FFE799, 0x00FFE898, 0x00FFEF99,
        0x00FFF998, 0x00FFFE99, 0x01000045, 0x01000C99, 0x01000D45, 0x01002799, 0x01002845,
        0x01003B99, 0x01003C45, 0x01003E99, 0x01003F45, 0x01004E99, 0x01005045, 0x01005E99,
        0x01008045, 0x0100FB99, 0x01010098, 0x01010399, 0x01010798, 0x01013499, 0x01013798,
        0x01014028, 0x01018F99, 0x01019098, 0x01019C99, 0x0101A028, 0x0101A199, 0x0101D098,
        0x0101FD97, 0x0101FE99, 0x01028047, 0x01029D99, 0x0102A014, 0x0102D199, 0x0102E097,
        0x0102E198, 0x0102FC99, 0x01030036, 0x01032499, 0x01032D36, 0x01033026, 0x01034B99,
        0x01035067, 0x01037B99, 0x0103808F, 0x01039E99, 0x01039F8F, 0x0103A093, 0x0103C499,
        0x0103C893, 0x0103D699, 0x0104001C, 0x01045075, 0x01048064, 0x01049E99, 0x0104A064,
        0x0104AA99, 0x0104B063, 0x0104D499, 0x0104D863, 0x0104FC99, 0x0105001F, 0x01052899,
        0x01053001, 0x01056499, 0x01056F01, 0x01057099, 0x01060044, 0x01073799, 0x01074044,
        0x01075699, 0x01076044, 0x01076899, 0x01080018, 0x01080699, 0x01080818, 0x01080999,
        0x01080A18, 0x01083699, 0x01083718, 0x01083999, 0x01083C18, 0x01083D99, 0x01083F18,
        0x01084004, 0x01085699, 0x01085704, 0x01086065, 0x0108805B, 0x01089F99, 0x0108A75B,
        0x0108B099, 0x0108E02E, 0x0108F399, 0x0108F42E, 0x0108F699, 0x0108FB2E, 0x0109006B,
        0x01091C99, 0x01091F6B, 0x01092048, 0x01093A99, 0x01093F48, 0x01094099, 0x01098051,
        0x0109A050, 0x0109B899, 0x0109BC50, 0x0109D099, 0x0109D250, 0x010A003A, 0x010A0499,
        0x010A053A, 0x010A0799, 0x010A0C3A, 0x010A1499, 0x010A153A, 0x010A1899, 0x010A193A,
        0x010A3699, 0x010A383A, 0x010A3B99, 0x010A3F3A, 0x010A4999, 0x010A503A, 0x010A5999,
        0x010A6072, 0x010A805A, 0x010AA099, 0x010AC04C, 0x010AE799, 0x010AEB4C, 0x010AF799,
        0x010B0006, 0x010B3699, 0x010B3906, 0x010B406D, 0x010B5699, 0x010B586D, 0x010B6069,
        0x010B7399, 0x010B7869, 0x010B806A, 0x010B9299, 0x010B996A, 0x010B9D99, 0x010BA96A,
        0x010BB099, 0x010C0061, 0x010C4999, 0x010C8035, 0x010CB399, 0x010CC035, 0x010CF399,
        0x010CFA35, 0x010D006F, 0x010D2899, 0x010D306F, 0x010D3A99, 0x010E6003, 0x010E7F99,
        0x010F007B, 0x010F2899, 0x010F307A, 0x010F5A99, 0x010FE020, 0x010FF799, 0x0110000E,
        0x01104E99, 0x0110520E, 0x01107099, 0x01107F0E, 0x0110803E, 0x0110C299, 0x0110CD3E,
        0x0110CE99, 0x0110D07C, 0x0110E999, 0x0110F07C, 0x0110FA99, 0x01110012, 0x01113599,
        0x01113612, 0x01114799, 0x01115049, 0x01117799, 0x01118076, 0x0111CE99, 0x0111D076,
        0x0111E099, 0x0111E179, 0x0111F599, 0x0112003C, 0x01121299, 0x0112133C, 0x01123F99,
        0x01128057, 0x01128799, 0x01128857, 0x01128999, 0x01128A57, 0x01128E99, 0x01128F57,
        0x01129E99, 0x01129F57, 0x0112AA99, 0x0112B078, 0x0112EB99, 0x0112F078, 0x0112FA99,
        0x01130027, 0x01130499, 0x01130527, 0x01130D99, 0x01130F27, 0x01131199, 0x01131327,
        0x01132999, 0x01132A27, 0x01133199, 0x01133227, 0x01133499, 0x01133527, 0x01133A99,
        0x01133B97, 0x01133C27, 0x01134599, 0x01134727, 0x01134999, 0x01134B27, 0x01134E99,
        0x01135027, 0x01135199, 0x01135727, 0x01135899, 0x01135D27, 0x01136499, 0x01136627,
        0x01136D99, 0x01137027, 0x01137599, 0x0114005C, 0x01145A99, 0x01145B5C, 0x01145C99,
        0x01145D5C, 0x01146099, 0x0114808E, 0x0114C899, 0x0114D08E, 0x0114DA99, 0x01158077,
        0x0115B699, 0x0115B877, 0x0115DE99, 0x01160053, 0x01164599, 0x01165053, 0x01165A99,
        0x01166054, 0x01166D99, 0x01168082, 0x0116B999, 0x0116C082, 0x0116CA99, 0x01170002,
        0x01171B99, 0x01171D02, 0x01172C99, 0x01173002, 0x01174099, 0x0118001B, 0x01183C99,
        0x0118A091, 0x0118F399, 0x0118FF91, 0x01190099, 0x0119A059, 0x0119A899, 0x0119AA59,
        0x0119D899, 0x0119DA59, 0x0119E599, 0x011A0096, 0x011A4899, 0x011A507D, 0x011AA399,
        0x011AC066, 0x011AF999, 0x011C000C, 0x011C0999, 0x011C0A0C, 0x011C3799, 0x011C380C,
        0x011C4699, 0x011C500C, 0x011C6D99, 0x011C704D, 0x011C9099, 0x011C924D, 0x011CA899,
        0x011CA94D, 0x011CB799, 0x011D0025, 0x011D0799, 0x011D0825, 0x011D0A99, 0x011D0B25,
        0x011D3799, 0x011D3A25, 0x011D3B99, 0x011D3C25, 0x011D3E99, 0x011D3F25, 0x011D4899,
        0x011D5025, 0x011D5A99, 0x011D6024, 0x011D6699, 0x011D6724, 0x011D6999, 0x011D6A24,
        0x011D8F99, 0x011D9024, 0x011D9299, 0x011D9324, 0x011D9999, 0x011DA024, 0x011DAA99,
        0x011EE04A, 0x011EF999, 0x011FC085, 0x011FF299, 0x011FFF85, 0x01200094, 0x01239A99,
        0x01240094, 0x01246F99, 0x01247094, 0x01247599, 0x01248094, 0x01254499, 0x0130001E,
        0x01342F99, 0x0134301E, 0x01343999, 0x01440031, 0x01464799, 0x01680008, 0x016A3999,
        0x016A4055, 0x016A5F99, 0x016A6055, 0x016A6A99, 0x016A6E55, 0x016A7099, 0x016AD009,
        0x016AEE99, 0x016AF009, 0x016AF699, 0x016B0032, 0x016B4699, 0x016B5032, 0x016B5A99,
        0x016B5B32, 0x016B6299, 0x016B6332, 0x016B7899, 0x016B7D32, 0x016B9099, 0x016E404E,
        0x016E9B99, 0x016F006C, 0x016F4B99, 0x016F4F6C, 0x016F8899, 0x016F8F6C, 0x016FA099,
        0x016FE086, 0x016FE15E, 0x016FE298, 0x016FE499, 0x01700086, 0x0187F899, 0x01880086,
        0x018AF399, 0x01B00039, 0x01B00130, 0x01B11F99, 0x01B15030, 0x01B15399, 0x01B16439,
        0x01B16899, 0x01B1705E, 0x01B2FC99, 0x01BC001D, 0x01BC6B99, 0x01BC701D, 0x01BC7D99,
        0x01BC801D, 0x01BC8999, 0x01BC901D, 0x01BC9A99, 0x01BC9C1D, 0x01BCA098, 0x01BCA499,
        0x01D00098, 0x01D0F699, 0x01D10098, 0x01D12799, 0x01D12998, 0x01D16797, 0x01D16A98,
        0x01D17B97, 0x01D18398, 0x01D18597, 0x01D18C98, 0x01D1AA97, 0x01D1AE98, 0x01D1E999,
        0x01D20028, 0x01D24699, 0x01D2E098, 0x01D2F499, 0x01D30098, 0x01D35799, 0x01D36098,
        0x01D37999, 0x01D40098, 0x01D45599, 0x01D45698, 0x01D49D99, 0x01D49E98, 0x01D4A099,
        0x01D4A298, 0x01D4A399, 0x01D4A598, 0x01D4A799, 0x01D4A998, 0x01D4AD99, 0x01D4AE98,
        0x01D4BA99, 0x01D4BB98, 0x01D4BC99, 0x01D4BD98, 0x01D4C499, 0x01D4C598, 0x01D50699,
        0x01D50798, 0x01D50B99, 0x01D50D98, 0x01D51599, 0x01D51698, 0x01D51D99, 0x01D51E98,
        0x01D53A99, 0x01D53B98, 0x01D53F99, 0x01D54098, 0x01D54599, 0x01D54698, 0x01D54799,
        0x01D54A98, 0x01D55199, 0x01D55298, 0x01D6A699, 0x01D6A898, 0x01D7CC99, 0x01D7CE98,
        0x01D80074, 0x01DA8C99, 0x01DA9B74, 0x01DAA099, 0x01DAA174, 0x01DAB099, 0x01E00023,
        0x01E00799, 0x01E00823, 0x01E01999, 0x01E01B23, 0x01E02299, 0x01E02323, 0x01E02599,
        0x01E02623, 0x01E02B99, 0x01E10033, 0x01E12D99, 0x01E13033, 0x01E13E99, 0x01E14033,
        0x01E14A99, 0x01E14E33, 0x01E15099, 0x01E2C092, 0x01E2FA99, 0x01E2FF92, 0x01E30099,
        0x01E8004F, 0x01E8C599, 0x01E8C74F, 0x01E8D799, 0x01E90000, 0x01E94C99, 0x01E95000,
        0x01E95A99, 0x01E95E00, 0x01E96099, 0x01EC7198, 0x01ECB599, 0x01ED0198, 0x01ED3E99,
        0x01EE0003, 0x01EE0499, 0x01EE0503, 0x01EE2099, 0x01EE2103, 0x01EE2399, 0x01EE2403,
        0x01EE2599, 0x01EE2703, 0x01EE2899, 0x01EE2903, 0x01EE3399, 0x01EE3403, 0x01EE3899,
        0x01EE3903, 0x01EE3A99, 0x01EE3B03, 0x01EE3C99, 0x01EE4203, 0x01EE4399, 0x01EE4703,
        0x01EE4899, 0x01EE4903, 0x01EE4A99, 0x01EE4B03, 0x01EE4C99, 0x01EE4D03, 0x01EE5099,
        0x01EE5103, 0x01EE5399, 0x01EE5403, 0x01EE5599, 0x01EE5703, 0x01EE5899, 0x01EE5903,
        0x01EE5A99, 0x01EE5B03, 0x01EE5C99, 0x01EE5D03, 0x01EE5E99, 0x01EE5F03, 0x01EE6099,
        0x01EE6103, 0x01EE6399, 0x01EE6403, 0x01EE6599, 0x01EE6703, 0x01EE6B99, 0x01EE6C03,
        0x01EE7399, 0x01EE7403, 0x01EE7899, 0x01EE7903, 0x01EE7D99, 0x01EE7E03, 0x01EE7F99,
        0x01EE8003, 0x01EE8A99, 0x01EE8B03, 0x01EE9C99, 0x01EEA103, 0x01EEA499, 0x01EEA503,
        0x01EEAA99, 0x01EEAB03, 0x01EEBC99, 0x01EEF003, 0x01EEF299, 0x01F00098, 0x01F02C99,
        0x01F03098, 0x01F09499, 0x01F0A098, 0x01F0AF99, 0x01F0B198, 0x01F0C099, 0x01F0C198,
        0x01F0D099, 0x01F0D198, 0x01F0F699, 0x01F10098, 0x01F10D99, 0x01F11098, 0x01F16D99,
        0x01F17098, 0x01F1AD99, 0x01F1E698, 0x01F20030, 0x01F20198, 0x01F20399, 0x01F21098,
        0x01F23C99, 0x01F24098, 0x01F24999, 0x01F25098, 0x01F25299, 0x01F26098, 0x01F26699,
        0x01F30098, 0x01F6D699, 0x01F6E098, 0x01F6ED99, 0x01F6F098, 0x01F6FB99, 0x01F70098,
        0x01F77499, 0x01F78098, 0x01F7D999, 0x01F7E098, 0x01F7EC99, 0x01F80098, 0x01F80C99,
        0x01F81098, 0x01F84899, 0x01F85098, 0x01F85A99, 0x01F86098, 0x01F88899, 0x01F89098,
        0x01F8AE99, 0x01F90098, 0x01F90C99, 0x01F90D98, 0x01F97299, 0x01F97398, 0x01F97799,
        0x01F97A98, 0x01F9A399, 0x01F9A598, 0x01F9AB99, 0x01F9AE98, 0x01F9CB99, 0x01F9CD98,
        0x01FA5499, 0x01FA6098, 0x01FA6E99, 0x01FA7098, 0x01FA7499, 0x01FA7898, 0x01FA7B99,
        0x01FA8098, 0x01FA8399, 0x01FA9098, 0x01FA9699, 0x0200002C, 0x02000299, 0x0200622C,
        0x02006399, 0x0200642C, 0x02006599, 0x0200E02C, 0x0200E199, 0x0200E22C, 0x0200E399,
        0x02011F2C, 0x02012099, 0x0201212C, 0x02012299, 0x0209282C, 0x02092999, 0x02092A2C,
        0x02092B99, 0x0209812C, 0x02098299, 0x0209832C, 0x02098499, 0x02098A2C, 0x02098B99,
        0x02098C2C, 0x02098D99, 0x02099A2C, 0x02099B99, 0x02099C2C, 0x02099D99, 0x020AE82C,
        0x020AE999, 0x020AEA2C, 0x020AEB99, 0x020AFB2C, 0x020AFC99, 0x020AFD2C, 0x020AFE99,
        0x020B172C, 0x020B1899, 0x020B192C, 0x020B1A99, 0x02238E2C, 0x02238F99, 0x0223902C,
        0x02239199, 0x0229962C, 0x02299799, 0x0229982C, 0x02299999, 0x023B192C, 0x023B1A99,
        0x023B1B2C, 0x023B1C99, 0x02626B2C, 0x02626C99, 0x02626D2C, 0x02626E99, 0x02A6D52C,
        0x02A6D699, 0x02B7332C, 0x02B73499, 0x02B81C2C, 0x02B81D99, 0x02CEA02C, 0x02CEA199,
        0x02EBDF2C, 0x02EBE099, 0x02F8002C, 0x02FA1E99, 0x0E000198, 0x0E000299, 0x0E002098,
        0x0E008099, 0x0E010097, 0x0E01F099, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x0009531A, 0x0009541A};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<1> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00034228, 0x00034399, 0x00034528, 0x00034699, 0x00036341, 0x00037099,
        0x00048319, 0x00048899, 0x00058905, 0x00058A99, 0x00060C03, 0x00060D99, 0x00061B03,
        0x00061D99, 0x00061F03, 0x00062099, 0x00064000, 0x00064199, 0x00064B03, 0x00065699,
        0x00066003, 0x00066A99, 0x00067003, 0x00067199, 0x0006D403, 0x0006D599, 0x0009510B,
        0x00095399, 0x0009640B, 0x0009661A, 0x00097099, 0x0009E60B, 0x0009F099, 0x000A662A,
        0x000A7099, 0x000AE629, 0x000AF099, 0x000BE627, 0x000BF499, 0x000CE63D, 0x000CF099,
        0x00104012, 0x00104A99, 0x0010FB22, 0x0010FC99, 0x00173511, 0x00173799, 0x00180254,
        0x00180499, 0x00180554, 0x00180699, 0x001CD00B, 0x001CD11A, 0x001CD20B, 0x001CD31A,
        0x001CD50B, 0x001CD71A, 0x001CD80B, 0x001CD91A, 0x001CE10B, 0x001CE21A, 0x001CEA0B,
        0x001CEB1A, 0x001CED0B, 0x001CEE1A, 0x001CF20B, 0x001CF31A, 0x001CF50B, 0x001CF81A,
        0x001CFA59, 0x001CFB99, 0x001DC028, 0x001DC299, 0x00202F41, 0x00203099, 0x0020F01A,
        0x0020F199, 0x002E4319, 0x002E4499, 0x0030010D, 0x00300499, 0x0030062C, 0x00300799,
        0x0030080D, 0x00301299, 0x0030130D, 0x00302099, 0x00302A0D, 0x00302E99, 0x0030300D,
        0x00303130, 0x00303699, 0x0030370D, 0x00303899, 0x00303C2C, 0x00304099, 0x00309930,
        0x00309D99, 0x0030A030, 0x0030A199, 0x0030FB0D, 0x0030FC30, 0x0030FD99, 0x0031902C,
        0x0031A099, 0x0031C02C, 0x0031E499, 0x0032202C, 0x00324899, 0x0032802C, 0x0032B199,
        0x0032C02C, 0x0032CC99, 0x0033582C, 0x00337199, 0x00337B2C, 0x00338099, 0x0033E02C,
        0x0033FF99, 0x00A66F19, 0x00A67099, 0x00A8301A, 0x00A83A99, 0x00A8F10B, 0x00A8F299,
        0x00A8F31A, 0x00A8F499, 0x00A92E38, 0x00A92F99, 0x00A9CF10, 0x00A9D099, 0x00FDF203,
        0x00FDF399, 0x00FDFD03, 0x00FDFE99, 0x00FE450D, 0x00FE4799, 0x00FF610D, 0x00FF6699,
        0x00FF7030, 0x00FF7199, 0x00FF9E30, 0x00FFA099, 0x01010018, 0x01010399, 0x01010718,
        0x01013499, 0x01013718, 0x01014099, 0x0102E003, 0x0102FC99, 0x01130127, 0x01130299,
        0x01130327, 0x01130499, 0x01133B27, 0x01133D99, 0x011FD027, 0x011FD299, 0x011FD327,
        0x011FD499, 0x01BCA01D, 0x01BCA499, 0x01D3602C, 0x01D37299, 0x01F2502C, 0x01F25299,
        0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x000CE699, 0x000CE799, 0x000CE899, 0x000CE999, 0x000CEA99, 0x000CEB99,
        0x000CEC99, 0x000CED99, 0x000CEE99, 0x000CEF99, 0x001CF21A, 0x00202F99};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x0006D499, 0x000BAA27, 0x000BB527, 0x000BF399, 0x001CD01A, 0x001CD21A, 0x001CD51A,
        0x001CD61A, 0x001CD81A, 0x001CE11A, 0x001CEA1A, 0x001CED1A, 0x001CF51A, 0x001CF61A};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<2> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00048367, 0x00048423, 0x00048541, 0x00048723, 0x00048899, 0x00058922,
        0x00058A99, 0x00060C6F, 0x00060D99, 0x00061B6F, 0x00061C80, 0x00061D99, 0x00061F6F,
        0x00062099, 0x00064003, 0x00064199, 0x00064B80, 0x00065699, 0x0006608B, 0x00066A99,
        0x00067080, 0x00067199, 0x0006D46F, 0x0006D599, 0x0009511A, 0x00095399, 0x0009641A,
        0x0009661B, 0x00097099, 0x0009E612, 0x0009F099, 0x000A6657, 0x000A7099, 0x000AE63C,
        0x000AF099, 0x000BE685, 0x000BF499, 0x000CE659, 0x000CF099, 0x00104058, 0x00104A99,
        0x0010FB41, 0x0010FC99, 0x0017352D, 0x00173799, 0x00180268, 0x00180499, 0x00180568,
        0x00180699, 0x001CD01A, 0x001CD199, 0x001CD21A, 0x001CD327, 0x001CD499, 0x001CD51A,
        0x001CD776, 0x001CD81A, 0x001CD976, 0x001CDA3D, 0x001CDB99, 0x001CDC76, 0x001CDE99,
        0x001CE076, 0x001CE11A, 0x001CE299, 0x001CE959, 0x001CEA1A, 0x001CEB99, 0x001CED1A,
        0x001CEE99, 0x001CF21A, 0x001CF327, 0x001CF51A, 0x001CF799, 0x001CF827, 0x001CFA99,
        0x00202F54, 0x00203099, 0x0020F027, 0x0020F199, 0x002E4323, 0x002E4499, 0x0030012B,
        0x00300499, 0x0030082B, 0x00301299, 0x0030132B, 0x00302099, 0x00302A2C, 0x00302E99,
        0x0030302B, 0x00303139, 0x00303699, 0x0030372B, 0x00303899, 0x00303C30, 0x00303E99,
        0x00309939, 0x00309D99, 0x0030A039, 0x0030A199, 0x0030FB2B, 0x0030FC39, 0x0030FD99,
        0x00A66F23, 0x00A67099, 0x00A8301B, 0x00A83A99, 0x00A8F11A, 0x00A8F299, 0x00A8F385,
        0x00A8F499, 0x00A92E41, 0x00A92F99, 0x00A9CF37, 0x00A9D099, 0x00FDF28B, 0x00FDF399,
        0x00FDFD8B, 0x00FDFE99, 0x00FE452B, 0x00FE4799, 0x00FF612B, 0x00FF6699, 0x00FF7039,
        0x00FF7199, 0x00FF9E39, 0x00FFA099, 0x01010045, 0x01010399, 0x01010744, 0x01013499,
        0x01013745, 0x01014099, 0x0102E017, 0x0102FC99, 0x01130185, 0x01130299, 0x01130385,
        0x01130499, 0x01133B85, 0x01133D99, 0x011FD085, 0x011FD299, 0x011FD385, 0x011FD499,
        0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x000CE699, 0x000CE799, 0x000CE899, 0x000CE999, 0x000CEA99, 0x000CEB99, 0x000CEC99,
        0x000CED99, 0x000CEE99, 0x000CEF99, 0x001CE999, 0x001CF227, 0x00202F99};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00060C80, 0x00061B80, 0x00061F80, 0x0006D499, 0x0009663E, 0x0009673E, 0x0009683E,
        0x0009693E, 0x00096A3E, 0x00096B3E, 0x00096C3E, 0x00096D3E, 0x00096E3E, 0x00096F3E,
        0x000BAA85, 0x000BB585, 0x000BF399, 0x001CD027, 0x001CD227, 0x001CD599, 0x001CD699,
        0x001CD899, 0x001CE199, 0x001CEA99, 0x001CED99, 0x001CF53D, 0x001CF699, 0x00A83029,
        0x00A83129, 0x00A83229, 0x00A83329, 0x00A83429, 0x00A83529, 0x00A83629, 0x00A83729,
        0x00A83829, 0x00A83929};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<3> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00060C80, 0x00060D99, 0x00061B80, 0x00061C8B, 0x00061D99, 0x00061F80,
        0x00062099, 0x0006404B, 0x00064199, 0x00095127, 0x00095399, 0x0009641B, 0x0009663E,
        0x00097099, 0x0009E67F, 0x0009F099, 0x00104083, 0x00104A99, 0x00173581, 0x00173799,
        0x001CD027, 0x001CD199, 0x001CD227, 0x001CD399, 0x001CDA52, 0x001CDB99, 0x001CF227,
        0x001CF399, 0x001CF43D, 0x001CF599, 0x0020F041, 0x0020F199, 0x0030012C, 0x00300499,
        0x0030082C, 0x00301299, 0x0030132C, 0x00302099, 0x0030302C, 0x00303199, 0x0030372C,
        0x00303899, 0x00303C39, 0x00303E99, 0x0030FB2C, 0x0030FC99, 0x00A83029, 0x00A83A99,
        0x00A92E58, 0x00A92F99, 0x00FE452C, 0x00FE4799, 0x00FF612C, 0x00FF6699, 0x01010745,
        0x01013499, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x001CF299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00060C8B, 0x00061B8B, 0x00061F8B, 0x00096427, 0x00096527, 0x00096649, 0x00096749,
        0x00096849, 0x00096949, 0x00096A49, 0x00096B49, 0x00096C49, 0x00096D49, 0x00096E49,
        0x00096F49, 0x001CD099, 0x001CD299, 0x001CF499, 0x00A8302A, 0x00A8312A, 0x00A8322A,
        0x00A8332A, 0x00A8342A, 0x00A8352A, 0x00A8362A, 0x00A8372A, 0x00A8382A, 0x00A8392A};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<4> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00060C8B, 0x00060D99, 0x00061B8B, 0x00061C99, 0x00061F8B, 0x00062099,
        0x0006404C, 0x00064199, 0x00095129, 0x00095399, 0x00096424, 0x00096649, 0x00097099,
        0x0017358A, 0x00173799, 0x001CD03D, 0x001CD199, 0x001CD23D, 0x001CD399, 0x001CDA62,
        0x001CDB99, 0x001CF23D, 0x001CF399, 0x00300130, 0x00300499, 0x00300830, 0x00301299,
        0x00301330, 0x00302099, 0x00303030, 0x00303199, 0x00303730, 0x00303899, 0x0030FB30,
        0x0030FC99, 0x00A8302A, 0x00A83A99, 0x00FE4530, 0x00FE4799, 0x00FF6130, 0x00FF6699,
        0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x001CF299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00060C99, 0x00061B99, 0x00061F99, 0x00096429, 0x00096529, 0x00096699, 0x00096799,
        0x00096899, 0x00096999, 0x00096A99, 0x00096B99, 0x00096C99, 0x00096D99, 0x00096E99,
        0x00096F99, 0x001CD099, 0x001CD299, 0x001CDA85, 0x00A8303D, 0x00A8313D, 0x00A8323D,
        0x00A8333D, 0x00A8343D, 0x00A8353D, 0x00A8363E, 0x00A8373E, 0x00A8383E, 0x00A8393E};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<5> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x0006406A, 0x00064199, 0x0009512A, 0x00095399, 0x00096425,
        0x00096699, 0x001CDA85, 0x001CDB99, 0x001CF259, 0x001CF399, 0x00300139,
        0x00300499, 0x00300839, 0x00301299, 0x00301339, 0x00302099, 0x00303039,
        0x00303199, 0x00303739, 0x00303899, 0x0030FB39, 0x0030FC99, 0x00A8303C,
        0x00A83A99, 0x00FE4539, 0x00FE4799, 0x00FF6139, 0x00FF6699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096427, 0x00096527,
                                                                      0x001CF299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x0009642A, 0x0009652A, 0x001CDA88, 0x00A8303E, 0x00A8313E, 0x00A8323E, 0x00A8333E,
        0x00A8343E, 0x00A8353E, 0x00A83649, 0x00A83749, 0x00A83849, 0x00A83949};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<6> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x0006406F, 0x00064199, 0x0009513D, 0x00095399, 0x00096427, 0x00096699,
        0x001CDA88, 0x001CDB99, 0x001CF262, 0x001CF399, 0x00300195, 0x00300399, 0x00300895,
        0x00301299, 0x00301495, 0x00301C99, 0x0030FB95, 0x0030FC99, 0x00A8303D, 0x00A8363E,
        0x00A83A99, 0x00FF6195, 0x00FF6699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096429, 0x00096529,
                                                                      0x001CF299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00064080, 0x0009643D, 0x0009653D, 0x001CDA99, 0x00A83049, 0x00A83149, 0x00A83249,
        0x00A83349, 0x00A83449, 0x00A83549, 0x00A83653, 0x00A83753, 0x00A83853, 0x00A83953};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<7> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x0006407A, 0x00064199, 0x00095141, 0x00095399, 0x00096429, 0x00096699,
        0x001CF288, 0x001CF399, 0x00A8303E, 0x00A83649, 0x00A83A99, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x0009642A, 0x0009652A,
                                                                      0x001CF299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00064099, 0x00096449, 0x00096543, 0x00A83053, 0x00A83153, 0x00A83253, 0x00A83353,
        0x00A83453, 0x00A83553, 0x00A83678, 0x00A83778, 0x00A83878, 0x00A83978};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<8> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00064080, 0x00064199, 0x00095152, 0x00095399, 0x0009642A, 0x00096699,
        0x001CF28E, 0x001CF399, 0x00A83049, 0x00A83653, 0x00A83A99, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x0009643D, 0x0009653D,
                                                                      0x001CF299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00064099, 0x00096452, 0x00096549, 0x00A83078, 0x00A83178, 0x00A83278, 0x00A83378,
        0x00A83478, 0x00A83578, 0x00A83682, 0x00A83782, 0x00A83882, 0x00A83982};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<9> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00095162, 0x00095399, 0x0009643D, 0x00096699,
        0x00A83052, 0x00A83353, 0x00A83678, 0x00A83A99, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096449, 0x00096543};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00096462, 0x00096552, 0x00A83082, 0x00A83182, 0x00A83282, 0x00A83382,
        0x00A83482, 0x00A83582, 0x00A8368E, 0x00A8378E, 0x00A8388E, 0x00A8398E};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<10> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00095176, 0x00095285, 0x00095399, 0x00096449, 0x00096543,
        0x00096699, 0x00A83053, 0x00A83359, 0x00A83682, 0x00A83A99, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x00096452, 0x00096549, 0x00A83378, 0x00A83478, 0x00A83578};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00096478, 0x00096562, 0x00A8308E, 0x00A8318E, 0x00A8328E, 0x00A8338E,
        0x00A8348E, 0x00A8358E, 0x00A83699, 0x00A83799, 0x00A83899, 0x00A83999};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<11> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00095185, 0x00095288, 0x00095399, 0x00096452, 0x00096549,
        0x00096699, 0x00A83059, 0x00A83378, 0x00A8368E, 0x00A83A99, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x00096462, 0x00096552, 0x00A83078, 0x00A83178,
        0x00A83278, 0x00A83382, 0x00A83482, 0x00A83582};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00096479, 0x00096578, 0x00A83099, 0x00A83199, 0x00A83299, 0x00A83399,
        0x00A83499, 0x00A83599, 0x00A83699, 0x00A83799, 0x00A83899, 0x00A83999};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<12> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00095188, 0x0009528E, 0x00095399, 0x00096459, 0x00096552,
        0x00096699, 0x00A83078, 0x00A83382, 0x00A83699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x00096478, 0x00096562, 0x00A83082, 0x00A83182,
        0x00A83282, 0x00A8338E, 0x00A8348E, 0x00A8358E};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00095299, 0x0009647F, 0x00096579, 0x00A83099, 0x00A83199,
        0x00A83299, 0x00A83399, 0x00A83499, 0x00A83599};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<13> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x0009518E, 0x00095299, 0x00096462, 0x00096559,
        0x00096699, 0x00A83082, 0x00A8338E, 0x00A83699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x00096479, 0x00096578, 0x00A8308E, 0x00A8318E,
        0x00A8328E, 0x00A83399, 0x00A83499, 0x00A83599};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {
        0x00095199, 0x00096482, 0x0009657F, 0x00A83099, 0x00A83199, 0x00A83299};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<14> {
    static constexpr const _compact_range scripts_data = {
        0x00000099, 0x00096478, 0x00096562, 0x00096699, 0x00A8308E, 0x00A83399, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {
        0x0009647F, 0x00096579, 0x00A83099, 0x00A83199, 0x00A83299};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {0x00096485, 0x00096582};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<15> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x00096479, 0x00096578,
                                                          0x00096699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096482, 0x0009657F};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {0x00096488, 0x00096585};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<16> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x0009647F, 0x00096579,
                                                          0x00096699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096485, 0x00096582};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {0x0009648E, 0x00096588};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<17> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x00096482, 0x0009657F,
                                                          0x00096699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096488, 0x00096585};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {0x00096499, 0x0009658E};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<18> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x00096485, 0x00096582,
                                                          0x00096699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x0009648E, 0x00096588};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {0x00096499, 0x00096599};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<19> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x00096488, 0x00096585,
                                                          0x00096699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096499, 0x0009658E};
    static constexpr const _compact_list scripts_data_compat_v10_0 = {0x00096599};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }

        if constexpr(v <= uni::version::v10_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v10_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<20> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x0009648E, 0x00096588,
                                                          0x00096699, 0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096499, 0x00096599};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<>
struct __script_data<21> {
    static constexpr const _compact_range scripts_data = {0x00000099, 0x0009658E, 0x00096699,
                                                          0xFFFFFFFF};
    static constexpr const _compact_list scripts_data_compat_v11_0 = {0x00096599};
    template<uni::version v>
    constexpr script older_cp_script(char32_t cp, script sc) {
        if constexpr(v <= uni::version::v11_0) {
            sc = static_cast<uni::script>(scripts_data_compat_v11_0.value(cp, uint8_t(sc)));
        }
        return sc;
    }
};
template<auto N, uni::version v = uni::version::standard_unicode_version>
constexpr script __cp_script(char32_t cp) {
    if(cp > 0x10FFFF)
        return script::unknown;

    uni::script sc = static_cast<uni::script>(
        __script_data<N>::scripts_data.value(cp, uint8_t(script::unknown)));
    if constexpr(v < uni::version::v12_0) {
        return __script_data<N>::older_cp_script(cp, sc);
    }
    return sc;
}
template<uni::version v = uni::version::standard_unicode_version>
constexpr script __get_cp_script(char32_t cp, int idx) {
    switch(idx) {
        case 0: return __cp_script<0, v>(cp);
        case 1: return __cp_script<1, v>(cp);
        case 2: return __cp_script<2, v>(cp);
        case 3: return __cp_script<3, v>(cp);
        case 4: return __cp_script<4, v>(cp);
        case 5: return __cp_script<5, v>(cp);
        case 6: return __cp_script<6, v>(cp);
        case 7: return __cp_script<7, v>(cp);
        case 8: return __cp_script<8, v>(cp);
        case 9: return __cp_script<9, v>(cp);
        case 10: return __cp_script<10, v>(cp);
        case 11: return __cp_script<11, v>(cp);
        case 12: return __cp_script<12, v>(cp);
        case 13: return __cp_script<13, v>(cp);
        case 14: return __cp_script<14, v>(cp);
        case 15: return __cp_script<15, v>(cp);
        case 16: return __cp_script<16, v>(cp);
        case 17: return __cp_script<17, v>(cp);
        case 18: return __cp_script<18, v>(cp);
        case 19: return __cp_script<19, v>(cp);
        case 20: return __cp_script<20, v>(cp);
        case 21: return __cp_script<21, v>(cp);
    }
    return script::zzzz;
}
static constexpr _compact_list __numeric_data8 = {
    0x00003000, 0x00003101, 0x00003202, 0x00003303, 0x00003404, 0x00003505, 0x00003606, 0x00003707,
    0x00003808, 0x00003909, 0x0000B202, 0x0000B303, 0x0000B901, 0x0000BC01, 0x0000BD01, 0x0000BE03,
    0x00066000, 0x00066101, 0x00066202, 0x00066303, 0x00066404, 0x00066505, 0x00066606, 0x00066707,
    0x00066808, 0x00066909, 0x0006F000, 0x0006F101, 0x0006F202, 0x0006F303, 0x0006F404, 0x0006F505,
    0x0006F606, 0x0006F707, 0x0006F808, 0x0006F909, 0x0007C000, 0x0007C101, 0x0007C202, 0x0007C303,
    0x0007C404, 0x0007C505, 0x0007C606, 0x0007C707, 0x0007C808, 0x0007C909, 0x00096600, 0x00096701,
    0x00096802, 0x00096903, 0x00096A04, 0x00096B05, 0x00096C06, 0x00096D07, 0x00096E08, 0x00096F09,
    0x0009E600, 0x0009E701, 0x0009E802, 0x0009E903, 0x0009EA04, 0x0009EB05, 0x0009EC06, 0x0009ED07,
    0x0009EE08, 0x0009EF09, 0x0009F401, 0x0009F501, 0x0009F603, 0x0009F701, 0x0009F803, 0x0009F910,
    0x000A6600, 0x000A6701, 0x000A6802, 0x000A6903, 0x000A6A04, 0x000A6B05, 0x000A6C06, 0x000A6D07,
    0x000A6E08, 0x000A6F09, 0x000AE600, 0x000AE701, 0x000AE802, 0x000AE903, 0x000AEA04, 0x000AEB05,
    0x000AEC06, 0x000AED07, 0x000AEE08, 0x000AEF09, 0x000B6600, 0x000B6701, 0x000B6802, 0x000B6903,
    0x000B6A04, 0x000B6B05, 0x000B6C06, 0x000B6D07, 0x000B6E08, 0x000B6F09, 0x000B7201, 0x000B7301,
    0x000B7403, 0x000B7501, 0x000B7601, 0x000B7703, 0x000BE600, 0x000BE701, 0x000BE802, 0x000BE903,
    0x000BEA04, 0x000BEB05, 0x000BEC06, 0x000BED07, 0x000BEE08, 0x000BEF09, 0x000BF00A, 0x000BF164,
    0x000C6600, 0x000C6701, 0x000C6802, 0x000C6903, 0x000C6A04, 0x000C6B05, 0x000C6C06, 0x000C6D07,
    0x000C6E08, 0x000C6F09, 0x000C7800, 0x000C7901, 0x000C7A02, 0x000C7B03, 0x000C7C01, 0x000C7D02,
    0x000C7E03, 0x000CE600, 0x000CE701, 0x000CE802, 0x000CE903, 0x000CEA04, 0x000CEB05, 0x000CEC06,
    0x000CED07, 0x000CEE08, 0x000CEF09, 0x000D5801, 0x000D5901, 0x000D5A03, 0x000D5B01, 0x000D5C01,
    0x000D5D03, 0x000D5E01, 0x000D6600, 0x000D6701, 0x000D6802, 0x000D6903, 0x000D6A04, 0x000D6B05,
    0x000D6C06, 0x000D6D07, 0x000D6E08, 0x000D6F09, 0x000D700A, 0x000D7164, 0x000D7301, 0x000D7401,
    0x000D7503, 0x000D7601, 0x000D7701, 0x000D7803, 0x000DE600, 0x000DE701, 0x000DE802, 0x000DE903,
    0x000DEA04, 0x000DEB05, 0x000DEC06, 0x000DED07, 0x000DEE08, 0x000DEF09, 0x000E5000, 0x000E5101,
    0x000E5202, 0x000E5303, 0x000E5404, 0x000E5505, 0x000E5606, 0x000E5707, 0x000E5808, 0x000E5909,
    0x000ED000, 0x000ED101, 0x000ED202, 0x000ED303, 0x000ED404, 0x000ED505, 0x000ED606, 0x000ED707,
    0x000ED808, 0x000ED909, 0x000F2000, 0x000F2101, 0x000F2202, 0x000F2303, 0x000F2404, 0x000F2505,
    0x000F2606, 0x000F2707, 0x000F2808, 0x000F2909, 0x000F2A01, 0x000F2B03, 0x000F2C05, 0x000F2D07,
    0x000F2E09, 0x000F2F0B, 0x000F300D, 0x000F310F, 0x000F3211, 0x00104000, 0x00104101, 0x00104202,
    0x00104303, 0x00104404, 0x00104505, 0x00104606, 0x00104707, 0x00104808, 0x00104909, 0x00109000,
    0x00109101, 0x00109202, 0x00109303, 0x00109404, 0x00109505, 0x00109606, 0x00109707, 0x00109808,
    0x00109909, 0x00136901, 0x00136A02, 0x00136B03, 0x00136C04, 0x00136D05, 0x00136E06, 0x00136F07,
    0x00137008, 0x00137109, 0x0013720A, 0x00137314, 0x0013741E, 0x00137528, 0x00137632, 0x0013773C,
    0x00137846, 0x00137950, 0x00137A5A, 0x00137B64, 0x0016EE11, 0x0016EF12, 0x0016F013, 0x0017E000,
    0x0017E101, 0x0017E202, 0x0017E303, 0x0017E404, 0x0017E505, 0x0017E606, 0x0017E707, 0x0017E808,
    0x0017E909, 0x0017F000, 0x0017F101, 0x0017F202, 0x0017F303, 0x0017F404, 0x0017F505, 0x0017F606,
    0x0017F707, 0x0017F808, 0x0017F909, 0x00181000, 0x00181101, 0x00181202, 0x00181303, 0x00181404,
    0x00181505, 0x00181606, 0x00181707, 0x00181808, 0x00181909, 0x00194600, 0x00194701, 0x00194802,
    0x00194903, 0x00194A04, 0x00194B05, 0x00194C06, 0x00194D07, 0x00194E08, 0x00194F09, 0x0019D000,
    0x0019D101, 0x0019D202, 0x0019D303, 0x0019D404, 0x0019D505, 0x0019D606, 0x0019D707, 0x0019D808,
    0x0019D909, 0x0019DA01, 0x001A8000, 0x001A8101, 0x001A8202, 0x001A8303, 0x001A8404, 0x001A8505,
    0x001A8606, 0x001A8707, 0x001A8808, 0x001A8909, 0x001A9000, 0x001A9101, 0x001A9202, 0x001A9303,
    0x001A9404, 0x001A9505, 0x001A9606, 0x001A9707, 0x001A9808, 0x001A9909, 0x001B5000, 0x001B5101,
    0x001B5202, 0x001B5303, 0x001B5404, 0x001B5505, 0x001B5606, 0x001B5707, 0x001B5808, 0x001B5909,
    0x001BB000, 0x001BB101, 0x001BB202, 0x001BB303, 0x001BB404, 0x001BB505, 0x001BB606, 0x001BB707,
    0x001BB808, 0x001BB909, 0x001C4000, 0x001C4101, 0x001C4202, 0x001C4303, 0x001C4404, 0x001C4505,
    0x001C4606, 0x001C4707, 0x001C4808, 0x001C4909, 0x001C5000, 0x001C5101, 0x001C5202, 0x001C5303,
    0x001C5404, 0x001C5505, 0x001C5606, 0x001C5707, 0x001C5808, 0x001C5909, 0x00207000, 0x00207404,
    0x00207505, 0x00207606, 0x00207707, 0x00207808, 0x00207909, 0x00208000, 0x00208101, 0x00208202,
    0x00208303, 0x00208404, 0x00208505, 0x00208606, 0x00208707, 0x00208808, 0x00208909, 0x00215001,
    0x00215101, 0x00215201, 0x00215301, 0x00215402, 0x00215501, 0x00215602, 0x00215703, 0x00215804,
    0x00215901, 0x00215A05, 0x00215B01, 0x00215C03, 0x00215D05, 0x00215E07, 0x00215F01, 0x00216001,
    0x00216102, 0x00216203, 0x00216304, 0x00216405, 0x00216506, 0x00216607, 0x00216708, 0x00216809,
    0x0021690A, 0x00216A0B, 0x00216B0C, 0x00216C32, 0x00216D64, 0x00217001, 0x00217102, 0x00217203,
    0x00217304, 0x00217405, 0x00217506, 0x00217607, 0x00217708, 0x00217809, 0x0021790A, 0x00217A0B,
    0x00217B0C, 0x00217C32, 0x00217D64, 0x00218506, 0x00218632, 0x00218900, 0x00246001, 0x00246102,
    0x00246203, 0x00246304, 0x00246405, 0x00246506, 0x00246607, 0x00246708, 0x00246809, 0x0024690A,
    0x00246A0B, 0x00246B0C, 0x00246C0D, 0x00246D0E, 0x00246E0F, 0x00246F10, 0x00247011, 0x00247112,
    0x00247213, 0x00247314, 0x00247401, 0x00247502, 0x00247603, 0x00247704, 0x00247805, 0x00247906,
    0x00247A07, 0x00247B08, 0x00247C09, 0x00247D0A, 0x00247E0B, 0x00247F0C, 0x0024800D, 0x0024810E,
    0x0024820F, 0x00248310, 0x00248411, 0x00248512, 0x00248613, 0x00248714, 0x00248801, 0x00248902,
    0x00248A03, 0x00248B04, 0x00248C05, 0x00248D06, 0x00248E07, 0x00248F08, 0x00249009, 0x0024910A,
    0x0024920B, 0x0024930C, 0x0024940D, 0x0024950E, 0x0024960F, 0x00249710, 0x00249811, 0x00249912,
    0x00249A13, 0x00249B14, 0x0024EA00, 0x0024EB0B, 0x0024EC0C, 0x0024ED0D, 0x0024EE0E, 0x0024EF0F,
    0x0024F010, 0x0024F111, 0x0024F212, 0x0024F313, 0x0024F414, 0x0024F501, 0x0024F602, 0x0024F703,
    0x0024F804, 0x0024F905, 0x0024FA06, 0x0024FB07, 0x0024FC08, 0x0024FD09, 0x0024FE0A, 0x0024FF00,
    0x00277601, 0x00277702, 0x00277803, 0x00277904, 0x00277A05, 0x00277B06, 0x00277C07, 0x00277D08,
    0x00277E09, 0x00277F0A, 0x00278001, 0x00278102, 0x00278203, 0x00278304, 0x00278405, 0x00278506,
    0x00278607, 0x00278708, 0x00278809, 0x0027890A, 0x00278A01, 0x00278B02, 0x00278C03, 0x00278D04,
    0x00278E05, 0x00278F06, 0x00279007, 0x00279108, 0x00279209, 0x0027930A, 0x002CFD01, 0x00300700,
    0x00302101, 0x00302202, 0x00302303, 0x00302404, 0x00302505, 0x00302606, 0x00302707, 0x00302808,
    0x00302909, 0x0030380A, 0x00303914, 0x00303A1E, 0x00319201, 0x00319302, 0x00319403, 0x00319504,
    0x00322001, 0x00322102, 0x00322203, 0x00322304, 0x00322405, 0x00322506, 0x00322607, 0x00322708,
    0x00322809, 0x0032290A, 0x0032480A, 0x00324914, 0x00324A1E, 0x00324B28, 0x00324C32, 0x00324D3C,
    0x00324E46, 0x00324F50, 0x00325115, 0x00325216, 0x00325317, 0x00325418, 0x00325519, 0x0032561A,
    0x0032571B, 0x0032581C, 0x0032591D, 0x00325A1E, 0x00325B1F, 0x00325C20, 0x00325D21, 0x00325E22,
    0x00325F23, 0x00328001, 0x00328102, 0x00328203, 0x00328304, 0x00328405, 0x00328506, 0x00328607,
    0x00328708, 0x00328809, 0x0032890A, 0x0032B124, 0x0032B225, 0x0032B326, 0x0032B427, 0x0032B528,
    0x0032B629, 0x0032B72A, 0x0032B82B, 0x0032B92C, 0x0032BA2D, 0x0032BB2E, 0x0032BC2F, 0x0032BD30,
    0x0032BE31, 0x0032BF32, 0x00340505, 0x00348302, 0x00382A05, 0x003B4D07, 0x004E0001, 0x004E0307,
    0x004E0903, 0x004E5D09, 0x004E8C02, 0x004E9405, 0x004E9604, 0x004EC00A, 0x004EE803, 0x004F0D05,
    0x004F7064, 0x00516902, 0x00516B08, 0x00516D06, 0x0053410A, 0x00534414, 0x0053451E, 0x00534C28,
    0x0053C103, 0x0053C203, 0x0053C303, 0x0053C403, 0x0056DB04, 0x0058F101, 0x0058F901, 0x005E7A01,
    0x005EFE09, 0x005EFF14, 0x005F0C01, 0x005F0D02, 0x005F0E03, 0x005F1002, 0x0062FE0A, 0x00634C08,
    0x0067D207, 0x006F0607, 0x00739609, 0x00767E64, 0x00808604, 0x008CAE02, 0x008CB302, 0x008D3002,
    0x00964606, 0x00964C64, 0x00967806, 0x0096F600, 0x00A62000, 0x00A62101, 0x00A62202, 0x00A62303,
    0x00A62404, 0x00A62505, 0x00A62606, 0x00A62707, 0x00A62808, 0x00A62909, 0x00A6E601, 0x00A6E702,
    0x00A6E803, 0x00A6E904, 0x00A6EA05, 0x00A6EB06, 0x00A6EC07, 0x00A6ED08, 0x00A6EE09, 0x00A6EF00,
    0x00A83001, 0x00A83101, 0x00A83203, 0x00A83301, 0x00A83401, 0x00A83503, 0x00A8D000, 0x00A8D101,
    0x00A8D202, 0x00A8D303, 0x00A8D404, 0x00A8D505, 0x00A8D606, 0x00A8D707, 0x00A8D808, 0x00A8D909,
    0x00A90000, 0x00A90101, 0x00A90202, 0x00A90303, 0x00A90404, 0x00A90505, 0x00A90606, 0x00A90707,
    0x00A90808, 0x00A90909, 0x00A9D000, 0x00A9D101, 0x00A9D202, 0x00A9D303, 0x00A9D404, 0x00A9D505,
    0x00A9D606, 0x00A9D707, 0x00A9D808, 0x00A9D909, 0x00A9F000, 0x00A9F101, 0x00A9F202, 0x00A9F303,
    0x00A9F404, 0x00A9F505, 0x00A9F606, 0x00A9F707, 0x00A9F808, 0x00A9F909, 0x00AA5000, 0x00AA5101,
    0x00AA5202, 0x00AA5303, 0x00AA5404, 0x00AA5505, 0x00AA5606, 0x00AA5707, 0x00AA5808, 0x00AA5909,
    0x00ABF000, 0x00ABF101, 0x00ABF202, 0x00ABF303, 0x00ABF404, 0x00ABF505, 0x00ABF606, 0x00ABF707,
    0x00ABF808, 0x00ABF909, 0x00F96B03, 0x00F9730A, 0x00F97802, 0x00F9B200, 0x00F9D106, 0x00F9D306,
    0x00F9FD0A, 0x00FF1000, 0x00FF1101, 0x00FF1202, 0x00FF1303, 0x00FF1404, 0x00FF1505, 0x00FF1606,
    0x00FF1707, 0x00FF1808, 0x00FF1909, 0x01010701, 0x01010802, 0x01010903, 0x01010A04, 0x01010B05,
    0x01010C06, 0x01010D07, 0x01010E08, 0x01010F09, 0x0101100A, 0x01011114, 0x0101121E, 0x01011328,
    0x01011432, 0x0101153C, 0x01011646, 0x01011750, 0x0101185A, 0x01011964, 0x01014001, 0x01014101,
    0x01014201, 0x01014305, 0x01014432, 0x01014805, 0x0101490A, 0x01014A32, 0x01014B64, 0x01014F05,
    0x0101500A, 0x01015132, 0x01015264, 0x0101570A, 0x01015801, 0x01015901, 0x01015A01, 0x01015B02,
    0x01015C02, 0x01015D02, 0x01015E02, 0x01015F05, 0x0101600A, 0x0101610A, 0x0101620A, 0x0101630A,
    0x0101640A, 0x0101651E, 0x01016632, 0x01016732, 0x01016832, 0x01016932, 0x01016A64, 0x01017305,
    0x01017432, 0x01017501, 0x01017601, 0x01017702, 0x01017803, 0x01018A00, 0x01018B01, 0x0102E101,
    0x0102E202, 0x0102E303, 0x0102E404, 0x0102E505, 0x0102E606, 0x0102E707, 0x0102E808, 0x0102E909,
    0x0102EA0A, 0x0102EB14, 0x0102EC1E, 0x0102ED28, 0x0102EE32, 0x0102EF3C, 0x0102F046, 0x0102F150,
    0x0102F25A, 0x0102F364, 0x01032001, 0x01032105, 0x0103220A, 0x01032332, 0x0103415A, 0x0103D101,
    0x0103D202, 0x0103D30A, 0x0103D414, 0x0103D564, 0x0104A000, 0x0104A101, 0x0104A202, 0x0104A303,
    0x0104A404, 0x0104A505, 0x0104A606, 0x0104A707, 0x0104A808, 0x0104A909, 0x01085801, 0x01085902,
    0x01085A03, 0x01085B0A, 0x01085C14, 0x01085D64, 0x01087901, 0x01087A02, 0x01087B03, 0x01087C04,
    0x01087D05, 0x01087E0A, 0x01087F14, 0x0108A701, 0x0108A802, 0x0108A903, 0x0108AA04, 0x0108AB04,
    0x0108AC05, 0x0108AD0A, 0x0108AE14, 0x0108AF64, 0x0108FB01, 0x0108FC05, 0x0108FD0A, 0x0108FE14,
    0x0108FF64, 0x01091601, 0x0109170A, 0x01091814, 0x01091964, 0x01091A02, 0x01091B03, 0x0109BC0B,
    0x0109BD01, 0x0109C001, 0x0109C102, 0x0109C203, 0x0109C304, 0x0109C405, 0x0109C506, 0x0109C607,
    0x0109C708, 0x0109C809, 0x0109C90A, 0x0109CA14, 0x0109CB1E, 0x0109CC28, 0x0109CD32, 0x0109CE3C,
    0x0109CF46, 0x0109D264, 0x0109F601, 0x0109F702, 0x0109F803, 0x0109F904, 0x0109FA05, 0x0109FB06,
    0x0109FC07, 0x0109FD08, 0x0109FE09, 0x0109FF0A, 0x010A4001, 0x010A4102, 0x010A4203, 0x010A4304,
    0x010A440A, 0x010A4514, 0x010A4664, 0x010A4801, 0x010A7D01, 0x010A7E32, 0x010A9D01, 0x010A9E0A,
    0x010A9F14, 0x010AEB01, 0x010AEC05, 0x010AED0A, 0x010AEE14, 0x010AEF64, 0x010B5801, 0x010B5902,
    0x010B5A03, 0x010B5B04, 0x010B5C0A, 0x010B5D14, 0x010B5E64, 0x010B7801, 0x010B7902, 0x010B7A03,
    0x010B7B04, 0x010B7C0A, 0x010B7D14, 0x010B7E64, 0x010BA901, 0x010BAA02, 0x010BAB03, 0x010BAC04,
    0x010BAD0A, 0x010BAE14, 0x010BAF64, 0x010CFA01, 0x010CFB05, 0x010CFC0A, 0x010CFD32, 0x010CFE64,
    0x010D3000, 0x010D3101, 0x010D3202, 0x010D3303, 0x010D3404, 0x010D3505, 0x010D3606, 0x010D3707,
    0x010D3808, 0x010D3909, 0x010E6001, 0x010E6102, 0x010E6203, 0x010E6304, 0x010E6405, 0x010E6506,
    0x010E6607, 0x010E6708, 0x010E6809, 0x010E690A, 0x010E6A14, 0x010E6B1E, 0x010E6C28, 0x010E6D32,
    0x010E6E3C, 0x010E6F46, 0x010E7050, 0x010E715A, 0x010E7264, 0x010E7B01, 0x010E7C01, 0x010E7D01,
    0x010E7E02, 0x010F1D01, 0x010F1E02, 0x010F1F03, 0x010F2004, 0x010F2105, 0x010F220A, 0x010F2314,
    0x010F241E, 0x010F2564, 0x010F2601, 0x010F5101, 0x010F520A, 0x010F5314, 0x010F5464, 0x01105201,
    0x01105302, 0x01105403, 0x01105504, 0x01105605, 0x01105706, 0x01105807, 0x01105908, 0x01105A09,
    0x01105B0A, 0x01105C14, 0x01105D1E, 0x01105E28, 0x01105F32, 0x0110603C, 0x01106146, 0x01106250,
    0x0110635A, 0x01106464, 0x01106600, 0x01106701, 0x01106802, 0x01106903, 0x01106A04, 0x01106B05,
    0x01106C06, 0x01106D07, 0x01106E08, 0x01106F09, 0x0110F000, 0x0110F101, 0x0110F202, 0x0110F303,
    0x0110F404, 0x0110F505, 0x0110F606, 0x0110F707, 0x0110F808, 0x0110F909, 0x01113600, 0x01113701,
    0x01113802, 0x01113903, 0x01113A04, 0x01113B05, 0x01113C06, 0x01113D07, 0x01113E08, 0x01113F09,
    0x0111D000, 0x0111D101, 0x0111D202, 0x0111D303, 0x0111D404, 0x0111D505, 0x0111D606, 0x0111D707,
    0x0111D808, 0x0111D909, 0x0111E101, 0x0111E202, 0x0111E303, 0x0111E404, 0x0111E505, 0x0111E606,
    0x0111E707, 0x0111E808, 0x0111E909, 0x0111EA0A, 0x0111EB14, 0x0111EC1E, 0x0111ED28, 0x0111EE32,
    0x0111EF3C, 0x0111F046, 0x0111F150, 0x0111F25A, 0x0111F364, 0x0112F000, 0x0112F101, 0x0112F202,
    0x0112F303, 0x0112F404, 0x0112F505, 0x0112F606, 0x0112F707, 0x0112F808, 0x0112F909, 0x01145000,
    0x01145101, 0x01145202, 0x01145303, 0x01145404, 0x01145505, 0x01145606, 0x01145707, 0x01145808,
    0x01145909, 0x0114D000, 0x0114D101, 0x0114D202, 0x0114D303, 0x0114D404, 0x0114D505, 0x0114D606,
    0x0114D707, 0x0114D808, 0x0114D909, 0x01165000, 0x01165101, 0x01165202, 0x01165303, 0x01165404,
    0x01165505, 0x01165606, 0x01165707, 0x01165808, 0x01165909, 0x0116C000, 0x0116C101, 0x0116C202,
    0x0116C303, 0x0116C404, 0x0116C505, 0x0116C606, 0x0116C707, 0x0116C808, 0x0116C909, 0x01173000,
    0x01173101, 0x01173202, 0x01173303, 0x01173404, 0x01173505, 0x01173606, 0x01173707, 0x01173808,
    0x01173909, 0x01173A0A, 0x01173B14, 0x0118E000, 0x0118E101, 0x0118E202, 0x0118E303, 0x0118E404,
    0x0118E505, 0x0118E606, 0x0118E707, 0x0118E808, 0x0118E909, 0x0118EA0A, 0x0118EB14, 0x0118EC1E,
    0x0118ED28, 0x0118EE32, 0x0118EF3C, 0x0118F046, 0x0118F150, 0x0118F25A, 0x011C5000, 0x011C5101,
    0x011C5202, 0x011C5303, 0x011C5404, 0x011C5505, 0x011C5606, 0x011C5707, 0x011C5808, 0x011C5909,
    0x011C5A01, 0x011C5B02, 0x011C5C03, 0x011C5D04, 0x011C5E05, 0x011C5F06, 0x011C6007, 0x011C6108,
    0x011C6209, 0x011C630A, 0x011C6414, 0x011C651E, 0x011C6628, 0x011C6732, 0x011C683C, 0x011C6946,
    0x011C6A50, 0x011C6B5A, 0x011C6C64, 0x011D5000, 0x011D5101, 0x011D5202, 0x011D5303, 0x011D5404,
    0x011D5505, 0x011D5606, 0x011D5707, 0x011D5808, 0x011D5909, 0x011DA000, 0x011DA101, 0x011DA202,
    0x011DA303, 0x011DA404, 0x011DA505, 0x011DA606, 0x011DA707, 0x011DA808, 0x011DA909, 0x011FC001,
    0x011FC101, 0x011FC201, 0x011FC301, 0x011FC401, 0x011FC501, 0x011FC603, 0x011FC703, 0x011FC801,
    0x011FC901, 0x011FCA01, 0x011FCB01, 0x011FCC01, 0x011FCD03, 0x011FCE03, 0x011FCF01, 0x011FD001,
    0x011FD101, 0x011FD201, 0x011FD303, 0x011FD401, 0x01240002, 0x01240103, 0x01240204, 0x01240305,
    0x01240406, 0x01240507, 0x01240608, 0x01240709, 0x01240803, 0x01240904, 0x01240A05, 0x01240B06,
    0x01240C07, 0x01240D08, 0x01240E09, 0x01240F04, 0x01241005, 0x01241106, 0x01241207, 0x01241308,
    0x01241409, 0x01241501, 0x01241602, 0x01241703, 0x01241804, 0x01241905, 0x01241A06, 0x01241B07,
    0x01241C08, 0x01241D09, 0x01241E01, 0x01241F02, 0x01242003, 0x01242104, 0x01242205, 0x01242302,
    0x01242403, 0x01242503, 0x01242604, 0x01242705, 0x01242806, 0x01242907, 0x01242A08, 0x01242B09,
    0x01242C01, 0x01242D02, 0x01242E03, 0x01242F03, 0x01243004, 0x01243105, 0x01243401, 0x01243502,
    0x01243603, 0x01243703, 0x01243804, 0x01243905, 0x01243A03, 0x01243B03, 0x01243C04, 0x01243D04,
    0x01243E04, 0x01243F04, 0x01244006, 0x01244107, 0x01244207, 0x01244307, 0x01244408, 0x01244508,
    0x01244609, 0x01244709, 0x01244809, 0x01244909, 0x01244A02, 0x01244B03, 0x01244C04, 0x01244D05,
    0x01244E06, 0x01244F01, 0x01245002, 0x01245103, 0x01245204, 0x01245304, 0x01245405, 0x01245505,
    0x01245602, 0x01245703, 0x01245801, 0x01245902, 0x01245A01, 0x01245B02, 0x01245C05, 0x01245D01,
    0x01245E02, 0x01245F01, 0x01246001, 0x01246101, 0x01246201, 0x01246301, 0x01246401, 0x01246501,
    0x01246602, 0x01246728, 0x01246832, 0x01246904, 0x01246A05, 0x01246B06, 0x01246C07, 0x01246D08,
    0x01246E09, 0x016A6000, 0x016A6101, 0x016A6202, 0x016A6303, 0x016A6404, 0x016A6505, 0x016A6606,
    0x016A6707, 0x016A6808, 0x016A6909, 0x016B5000, 0x016B5101, 0x016B5202, 0x016B5303, 0x016B5404,
    0x016B5505, 0x016B5606, 0x016B5707, 0x016B5808, 0x016B5909, 0x016B5B0A, 0x016B5C64, 0x016E8000,
    0x016E8101, 0x016E8202, 0x016E8303, 0x016E8404, 0x016E8505, 0x016E8606, 0x016E8707, 0x016E8808,
    0x016E8909, 0x016E8A0A, 0x016E8B0B, 0x016E8C0C, 0x016E8D0D, 0x016E8E0E, 0x016E8F0F, 0x016E9010,
    0x016E9111, 0x016E9212, 0x016E9313, 0x016E9401, 0x016E9502, 0x016E9603, 0x01D2E000, 0x01D2E101,
    0x01D2E202, 0x01D2E303, 0x01D2E404, 0x01D2E505, 0x01D2E606, 0x01D2E707, 0x01D2E808, 0x01D2E909,
    0x01D2EA0A, 0x01D2EB0B, 0x01D2EC0C, 0x01D2ED0D, 0x01D2EE0E, 0x01D2EF0F, 0x01D2F010, 0x01D2F111,
    0x01D2F212, 0x01D2F313, 0x01D36001, 0x01D36102, 0x01D36203, 0x01D36304, 0x01D36405, 0x01D36506,
    0x01D36607, 0x01D36708, 0x01D36809, 0x01D3690A, 0x01D36A14, 0x01D36B1E, 0x01D36C28, 0x01D36D32,
    0x01D36E3C, 0x01D36F46, 0x01D37050, 0x01D3715A, 0x01D37201, 0x01D37302, 0x01D37403, 0x01D37504,
    0x01D37605, 0x01D37701, 0x01D37805, 0x01D7CE00, 0x01D7CF01, 0x01D7D002, 0x01D7D103, 0x01D7D204,
    0x01D7D305, 0x01D7D406, 0x01D7D507, 0x01D7D608, 0x01D7D709, 0x01D7D800, 0x01D7D901, 0x01D7DA02,
    0x01D7DB03, 0x01D7DC04, 0x01D7DD05, 0x01D7DE06, 0x01D7DF07, 0x01D7E008, 0x01D7E109, 0x01D7E200,
    0x01D7E301, 0x01D7E402, 0x01D7E503, 0x01D7E604, 0x01D7E705, 0x01D7E806, 0x01D7E907, 0x01D7EA08,
    0x01D7EB09, 0x01D7EC00, 0x01D7ED01, 0x01D7EE02, 0x01D7EF03, 0x01D7F004, 0x01D7F105, 0x01D7F206,
    0x01D7F307, 0x01D7F408, 0x01D7F509, 0x01D7F600, 0x01D7F701, 0x01D7F802, 0x01D7F903, 0x01D7FA04,
    0x01D7FB05, 0x01D7FC06, 0x01D7FD07, 0x01D7FE08, 0x01D7FF09, 0x01E14000, 0x01E14101, 0x01E14202,
    0x01E14303, 0x01E14404, 0x01E14505, 0x01E14606, 0x01E14707, 0x01E14808, 0x01E14909, 0x01E2F000,
    0x01E2F101, 0x01E2F202, 0x01E2F303, 0x01E2F404, 0x01E2F505, 0x01E2F606, 0x01E2F707, 0x01E2F808,
    0x01E2F909, 0x01E8C701, 0x01E8C802, 0x01E8C903, 0x01E8CA04, 0x01E8CB05, 0x01E8CC06, 0x01E8CD07,
    0x01E8CE08, 0x01E8CF09, 0x01E95000, 0x01E95101, 0x01E95202, 0x01E95303, 0x01E95404, 0x01E95505,
    0x01E95606, 0x01E95707, 0x01E95808, 0x01E95909, 0x01EC7101, 0x01EC7202, 0x01EC7303, 0x01EC7404,
    0x01EC7505, 0x01EC7606, 0x01EC7707, 0x01EC7808, 0x01EC7909, 0x01EC7A0A, 0x01EC7B14, 0x01EC7C1E,
    0x01EC7D28, 0x01EC7E32, 0x01EC7F3C, 0x01EC8046, 0x01EC8150, 0x01EC825A, 0x01EC8364, 0x01ECA301,
    0x01ECA402, 0x01ECA503, 0x01ECA604, 0x01ECA705, 0x01ECA806, 0x01ECA907, 0x01ECAA08, 0x01ECAB09,
    0x01ECAD01, 0x01ECAE01, 0x01ECAF03, 0x01ECB101, 0x01ECB202, 0x01ED0101, 0x01ED0202, 0x01ED0303,
    0x01ED0404, 0x01ED0505, 0x01ED0606, 0x01ED0707, 0x01ED0808, 0x01ED0909, 0x01ED0A0A, 0x01ED0B14,
    0x01ED0C1E, 0x01ED0D28, 0x01ED0E32, 0x01ED0F3C, 0x01ED1046, 0x01ED1150, 0x01ED125A, 0x01ED1364,
    0x01ED2F02, 0x01ED3003, 0x01ED3104, 0x01ED3205, 0x01ED3306, 0x01ED3407, 0x01ED3508, 0x01ED3609,
    0x01ED370A, 0x01ED3C01, 0x01ED3D01, 0x01F10000, 0x01F10100, 0x01F10201, 0x01F10302, 0x01F10403,
    0x01F10504, 0x01F10605, 0x01F10706, 0x01F10807, 0x01F10908, 0x01F10A09, 0x01F10B00, 0x01F10C00,
    0x02000107, 0x02006404, 0x0200E204, 0x02012105, 0x02092A01, 0x0209831E, 0x02098C28, 0x02099C28,
    0x020AEA06, 0x020AFD03, 0x020B1903, 0x02239002, 0x02299803, 0x023B1B03, 0x02626D04, 0x02F89009};
static constexpr std::array __numeric_data16 = {
    std::pair<char32_t, int16_t>{0x0BF2, 1000},   std::pair<char32_t, int16_t>{0x0D72, 1000},
    std::pair<char32_t, int16_t>{0x0F33, -1},     std::pair<char32_t, int16_t>{0x137C, 10000},
    std::pair<char32_t, int16_t>{0x216E, 500},    std::pair<char32_t, int16_t>{0x216F, 1000},
    std::pair<char32_t, int16_t>{0x217E, 500},    std::pair<char32_t, int16_t>{0x217F, 1000},
    std::pair<char32_t, int16_t>{0x2180, 1000},   std::pair<char32_t, int16_t>{0x2181, 5000},
    std::pair<char32_t, int16_t>{0x2182, 10000},  std::pair<char32_t, int16_t>{0x4E07, 10000},
    std::pair<char32_t, int16_t>{0x4EDF, 1000},   std::pair<char32_t, int16_t>{0x5343, 1000},
    std::pair<char32_t, int16_t>{0x842C, 10000},  std::pair<char32_t, int16_t>{0x9621, 1000},
    std::pair<char32_t, int16_t>{0x1011A, 200},   std::pair<char32_t, int16_t>{0x1011B, 300},
    std::pair<char32_t, int16_t>{0x1011C, 400},   std::pair<char32_t, int16_t>{0x1011D, 500},
    std::pair<char32_t, int16_t>{0x1011E, 600},   std::pair<char32_t, int16_t>{0x1011F, 700},
    std::pair<char32_t, int16_t>{0x10120, 800},   std::pair<char32_t, int16_t>{0x10121, 900},
    std::pair<char32_t, int16_t>{0x10122, 1000},  std::pair<char32_t, int16_t>{0x10123, 2000},
    std::pair<char32_t, int16_t>{0x10124, 3000},  std::pair<char32_t, int16_t>{0x10125, 4000},
    std::pair<char32_t, int16_t>{0x10126, 5000},  std::pair<char32_t, int16_t>{0x10127, 6000},
    std::pair<char32_t, int16_t>{0x10128, 7000},  std::pair<char32_t, int16_t>{0x10129, 8000},
    std::pair<char32_t, int16_t>{0x1012A, 9000},  std::pair<char32_t, int16_t>{0x1012B, 10000},
    std::pair<char32_t, int16_t>{0x1012C, 20000}, std::pair<char32_t, int16_t>{0x1012D, 30000},
    std::pair<char32_t, int16_t>{0x10145, 500},   std::pair<char32_t, int16_t>{0x10146, 5000},
    std::pair<char32_t, int16_t>{0x1014C, 500},   std::pair<char32_t, int16_t>{0x1014D, 1000},
    std::pair<char32_t, int16_t>{0x1014E, 5000},  std::pair<char32_t, int16_t>{0x10153, 500},
    std::pair<char32_t, int16_t>{0x10154, 1000},  std::pair<char32_t, int16_t>{0x10155, 10000},
    std::pair<char32_t, int16_t>{0x1016B, 300},   std::pair<char32_t, int16_t>{0x1016C, 500},
    std::pair<char32_t, int16_t>{0x1016D, 500},   std::pair<char32_t, int16_t>{0x1016E, 500},
    std::pair<char32_t, int16_t>{0x1016F, 500},   std::pair<char32_t, int16_t>{0x10170, 500},
    std::pair<char32_t, int16_t>{0x10171, 1000},  std::pair<char32_t, int16_t>{0x10172, 5000},
    std::pair<char32_t, int16_t>{0x102F4, 200},   std::pair<char32_t, int16_t>{0x102F5, 300},
    std::pair<char32_t, int16_t>{0x102F6, 400},   std::pair<char32_t, int16_t>{0x102F7, 500},
    std::pair<char32_t, int16_t>{0x102F8, 600},   std::pair<char32_t, int16_t>{0x102F9, 700},
    std::pair<char32_t, int16_t>{0x102FA, 800},   std::pair<char32_t, int16_t>{0x102FB, 900},
    std::pair<char32_t, int16_t>{0x1034A, 900},   std::pair<char32_t, int16_t>{0x1085E, 1000},
    std::pair<char32_t, int16_t>{0x1085F, 10000}, std::pair<char32_t, int16_t>{0x109D3, 200},
    std::pair<char32_t, int16_t>{0x109D4, 300},   std::pair<char32_t, int16_t>{0x109D5, 400},
    std::pair<char32_t, int16_t>{0x109D6, 500},   std::pair<char32_t, int16_t>{0x109D7, 600},
    std::pair<char32_t, int16_t>{0x109D8, 700},   std::pair<char32_t, int16_t>{0x109D9, 800},
    std::pair<char32_t, int16_t>{0x109DA, 900},   std::pair<char32_t, int16_t>{0x109DB, 1000},
    std::pair<char32_t, int16_t>{0x109DC, 2000},  std::pair<char32_t, int16_t>{0x109DD, 3000},
    std::pair<char32_t, int16_t>{0x109DE, 4000},  std::pair<char32_t, int16_t>{0x109DF, 5000},
    std::pair<char32_t, int16_t>{0x109E0, 6000},  std::pair<char32_t, int16_t>{0x109E1, 7000},
    std::pair<char32_t, int16_t>{0x109E2, 8000},  std::pair<char32_t, int16_t>{0x109E3, 9000},
    std::pair<char32_t, int16_t>{0x109E4, 10000}, std::pair<char32_t, int16_t>{0x109E5, 20000},
    std::pair<char32_t, int16_t>{0x109E6, 30000}, std::pair<char32_t, int16_t>{0x10A47, 1000},
    std::pair<char32_t, int16_t>{0x10B5F, 1000},  std::pair<char32_t, int16_t>{0x10B7F, 1000},
    std::pair<char32_t, int16_t>{0x10CFF, 1000},  std::pair<char32_t, int16_t>{0x10E73, 200},
    std::pair<char32_t, int16_t>{0x10E74, 300},   std::pair<char32_t, int16_t>{0x10E75, 400},
    std::pair<char32_t, int16_t>{0x10E76, 500},   std::pair<char32_t, int16_t>{0x10E77, 600},
    std::pair<char32_t, int16_t>{0x10E78, 700},   std::pair<char32_t, int16_t>{0x10E79, 800},
    std::pair<char32_t, int16_t>{0x10E7A, 900},   std::pair<char32_t, int16_t>{0x11065, 1000},
    std::pair<char32_t, int16_t>{0x111F4, 1000},  std::pair<char32_t, int16_t>{0x16B5D, 10000},
    std::pair<char32_t, int16_t>{0x1EC84, 200},   std::pair<char32_t, int16_t>{0x1EC85, 300},
    std::pair<char32_t, int16_t>{0x1EC86, 400},   std::pair<char32_t, int16_t>{0x1EC87, 500},
    std::pair<char32_t, int16_t>{0x1EC88, 600},   std::pair<char32_t, int16_t>{0x1EC89, 700},
    std::pair<char32_t, int16_t>{0x1EC8A, 800},   std::pair<char32_t, int16_t>{0x1EC8B, 900},
    std::pair<char32_t, int16_t>{0x1EC8C, 1000},  std::pair<char32_t, int16_t>{0x1EC8D, 2000},
    std::pair<char32_t, int16_t>{0x1EC8E, 3000},  std::pair<char32_t, int16_t>{0x1EC8F, 4000},
    std::pair<char32_t, int16_t>{0x1EC90, 5000},  std::pair<char32_t, int16_t>{0x1EC91, 6000},
    std::pair<char32_t, int16_t>{0x1EC92, 7000},  std::pair<char32_t, int16_t>{0x1EC93, 8000},
    std::pair<char32_t, int16_t>{0x1EC94, 9000},  std::pair<char32_t, int16_t>{0x1EC95, 10000},
    std::pair<char32_t, int16_t>{0x1EC96, 20000}, std::pair<char32_t, int16_t>{0x1EC97, 30000},
    std::pair<char32_t, int16_t>{0x1ECB3, 10000}, std::pair<char32_t, int16_t>{0x1ED14, 200},
    std::pair<char32_t, int16_t>{0x1ED15, 300},   std::pair<char32_t, int16_t>{0x1ED16, 400},
    std::pair<char32_t, int16_t>{0x1ED17, 500},   std::pair<char32_t, int16_t>{0x1ED18, 600},
    std::pair<char32_t, int16_t>{0x1ED19, 700},   std::pair<char32_t, int16_t>{0x1ED1A, 800},
    std::pair<char32_t, int16_t>{0x1ED1B, 900},   std::pair<char32_t, int16_t>{0x1ED1C, 1000},
    std::pair<char32_t, int16_t>{0x1ED1D, 2000},  std::pair<char32_t, int16_t>{0x1ED1E, 3000},
    std::pair<char32_t, int16_t>{0x1ED1F, 4000},  std::pair<char32_t, int16_t>{0x1ED20, 5000},
    std::pair<char32_t, int16_t>{0x1ED21, 6000},  std::pair<char32_t, int16_t>{0x1ED22, 7000},
    std::pair<char32_t, int16_t>{0x1ED23, 8000},  std::pair<char32_t, int16_t>{0x1ED24, 9000},
    std::pair<char32_t, int16_t>{0x1ED25, 10000}, std::pair<char32_t, int16_t>{0x1ED26, 20000},
    std::pair<char32_t, int16_t>{0x1ED27, 30000}, std::pair<char32_t, int16_t>{0x1ED38, 400},
    std::pair<char32_t, int16_t>{0x1ED39, 600},   std::pair<char32_t, int16_t>{0x1ED3A, 2000},
    std::pair<char32_t, int16_t>{0x1ED3B, 10000},
};
static constexpr std::array __numeric_data32 = {
    std::pair<char32_t, int32_t>{0x2187, 50000},
    std::pair<char32_t, int32_t>{0x2188, 100000},
    std::pair<char32_t, int32_t>{0x4EBF, 100000000},
    std::pair<char32_t, int32_t>{0x5104, 100000000},
    std::pair<char32_t, int32_t>{0x1012E, 40000},
    std::pair<char32_t, int32_t>{0x1012F, 50000},
    std::pair<char32_t, int32_t>{0x10130, 60000},
    std::pair<char32_t, int32_t>{0x10131, 70000},
    std::pair<char32_t, int32_t>{0x10132, 80000},
    std::pair<char32_t, int32_t>{0x10133, 90000},
    std::pair<char32_t, int32_t>{0x10147, 50000},
    std::pair<char32_t, int32_t>{0x10156, 50000},
    std::pair<char32_t, int32_t>{0x109E7, 40000},
    std::pair<char32_t, int32_t>{0x109E8, 50000},
    std::pair<char32_t, int32_t>{0x109E9, 60000},
    std::pair<char32_t, int32_t>{0x109EA, 70000},
    std::pair<char32_t, int32_t>{0x109EB, 80000},
    std::pair<char32_t, int32_t>{0x109EC, 90000},
    std::pair<char32_t, int32_t>{0x109ED, 100000},
    std::pair<char32_t, int32_t>{0x109EE, 200000},
    std::pair<char32_t, int32_t>{0x109EF, 300000},
    std::pair<char32_t, int32_t>{0x109F0, 400000},
    std::pair<char32_t, int32_t>{0x109F1, 500000},
    std::pair<char32_t, int32_t>{0x109F2, 600000},
    std::pair<char32_t, int32_t>{0x109F3, 700000},
    std::pair<char32_t, int32_t>{0x109F4, 800000},
    std::pair<char32_t, int32_t>{0x109F5, 900000},
    std::pair<char32_t, int32_t>{0x12432, 216000},
    std::pair<char32_t, int32_t>{0x12433, 432000},
    std::pair<char32_t, int32_t>{0x16B5E, 1000000},
    std::pair<char32_t, int32_t>{0x16B5F, 100000000},
    std::pair<char32_t, int32_t>{0x1EC98, 40000},
    std::pair<char32_t, int32_t>{0x1EC99, 50000},
    std::pair<char32_t, int32_t>{0x1EC9A, 60000},
    std::pair<char32_t, int32_t>{0x1EC9B, 70000},
    std::pair<char32_t, int32_t>{0x1EC9C, 80000},
    std::pair<char32_t, int32_t>{0x1EC9D, 90000},
    std::pair<char32_t, int32_t>{0x1EC9E, 100000},
    std::pair<char32_t, int32_t>{0x1EC9F, 200000},
    std::pair<char32_t, int32_t>{0x1ECA0, 100000},
    std::pair<char32_t, int32_t>{0x1ECA1, 10000000},
    std::pair<char32_t, int32_t>{0x1ECA2, 20000000},
    std::pair<char32_t, int32_t>{0x1ECB4, 100000},
    std::pair<char32_t, int32_t>{0x1ED28, 40000},
    std::pair<char32_t, int32_t>{0x1ED29, 50000},
    std::pair<char32_t, int32_t>{0x1ED2A, 60000},
    std::pair<char32_t, int32_t>{0x1ED2B, 70000},
    std::pair<char32_t, int32_t>{0x1ED2C, 80000},
    std::pair<char32_t, int32_t>{0x1ED2D, 90000},
};
static constexpr std::array __numeric_data64 = {
    std::pair<char32_t, int64_t>{0x5146, 1000000000000},
    std::pair<char32_t, int64_t>{0x16B60, 10000000000},
    std::pair<char32_t, int64_t>{0x16B61, 1000000000000},
};
static constexpr std::array __numeric_data_d = {
    std::pair<char32_t, int16_t>{0x00BC, 4},    std::pair<char32_t, int16_t>{0x00BD, 2},
    std::pair<char32_t, int16_t>{0x00BE, 4},    std::pair<char32_t, int16_t>{0x09F4, 16},
    std::pair<char32_t, int16_t>{0x09F5, 8},    std::pair<char32_t, int16_t>{0x09F6, 16},
    std::pair<char32_t, int16_t>{0x09F7, 4},    std::pair<char32_t, int16_t>{0x09F8, 4},
    std::pair<char32_t, int16_t>{0x0B72, 4},    std::pair<char32_t, int16_t>{0x0B73, 2},
    std::pair<char32_t, int16_t>{0x0B74, 4},    std::pair<char32_t, int16_t>{0x0B75, 16},
    std::pair<char32_t, int16_t>{0x0B76, 8},    std::pair<char32_t, int16_t>{0x0B77, 16},
    std::pair<char32_t, int16_t>{0x0D58, 160},  std::pair<char32_t, int16_t>{0x0D59, 40},
    std::pair<char32_t, int16_t>{0x0D5A, 80},   std::pair<char32_t, int16_t>{0x0D5B, 20},
    std::pair<char32_t, int16_t>{0x0D5C, 10},   std::pair<char32_t, int16_t>{0x0D5D, 20},
    std::pair<char32_t, int16_t>{0x0D5E, 5},    std::pair<char32_t, int16_t>{0x0D73, 4},
    std::pair<char32_t, int16_t>{0x0D74, 2},    std::pair<char32_t, int16_t>{0x0D75, 4},
    std::pair<char32_t, int16_t>{0x0D76, 16},   std::pair<char32_t, int16_t>{0x0D77, 8},
    std::pair<char32_t, int16_t>{0x0D78, 16},   std::pair<char32_t, int16_t>{0x0F2A, 2},
    std::pair<char32_t, int16_t>{0x0F2B, 2},    std::pair<char32_t, int16_t>{0x0F2C, 2},
    std::pair<char32_t, int16_t>{0x0F2D, 2},    std::pair<char32_t, int16_t>{0x0F2E, 2},
    std::pair<char32_t, int16_t>{0x0F2F, 2},    std::pair<char32_t, int16_t>{0x0F30, 2},
    std::pair<char32_t, int16_t>{0x0F31, 2},    std::pair<char32_t, int16_t>{0x0F32, 2},
    std::pair<char32_t, int16_t>{0x0F33, 2},    std::pair<char32_t, int16_t>{0x2150, 7},
    std::pair<char32_t, int16_t>{0x2151, 9},    std::pair<char32_t, int16_t>{0x2152, 10},
    std::pair<char32_t, int16_t>{0x2153, 3},    std::pair<char32_t, int16_t>{0x2154, 3},
    std::pair<char32_t, int16_t>{0x2155, 5},    std::pair<char32_t, int16_t>{0x2156, 5},
    std::pair<char32_t, int16_t>{0x2157, 5},    std::pair<char32_t, int16_t>{0x2158, 5},
    std::pair<char32_t, int16_t>{0x2159, 6},    std::pair<char32_t, int16_t>{0x215A, 6},
    std::pair<char32_t, int16_t>{0x215B, 8},    std::pair<char32_t, int16_t>{0x215C, 8},
    std::pair<char32_t, int16_t>{0x215D, 8},    std::pair<char32_t, int16_t>{0x215E, 8},
    std::pair<char32_t, int16_t>{0x2CFD, 2},    std::pair<char32_t, int16_t>{0xA830, 4},
    std::pair<char32_t, int16_t>{0xA831, 2},    std::pair<char32_t, int16_t>{0xA832, 4},
    std::pair<char32_t, int16_t>{0xA833, 16},   std::pair<char32_t, int16_t>{0xA834, 8},
    std::pair<char32_t, int16_t>{0xA835, 16},   std::pair<char32_t, int16_t>{0x10140, 4},
    std::pair<char32_t, int16_t>{0x10141, 2},   std::pair<char32_t, int16_t>{0x10175, 2},
    std::pair<char32_t, int16_t>{0x10176, 2},   std::pair<char32_t, int16_t>{0x10177, 3},
    std::pair<char32_t, int16_t>{0x10178, 4},   std::pair<char32_t, int16_t>{0x1018B, 4},
    std::pair<char32_t, int16_t>{0x109BC, 12},  std::pair<char32_t, int16_t>{0x109BD, 2},
    std::pair<char32_t, int16_t>{0x109F6, 12},  std::pair<char32_t, int16_t>{0x109F7, 12},
    std::pair<char32_t, int16_t>{0x109F8, 12},  std::pair<char32_t, int16_t>{0x109F9, 12},
    std::pair<char32_t, int16_t>{0x109FA, 12},  std::pair<char32_t, int16_t>{0x109FB, 12},
    std::pair<char32_t, int16_t>{0x109FC, 12},  std::pair<char32_t, int16_t>{0x109FD, 12},
    std::pair<char32_t, int16_t>{0x109FE, 12},  std::pair<char32_t, int16_t>{0x109FF, 12},
    std::pair<char32_t, int16_t>{0x10A48, 2},   std::pair<char32_t, int16_t>{0x10E7B, 2},
    std::pair<char32_t, int16_t>{0x10E7C, 4},   std::pair<char32_t, int16_t>{0x10E7D, 3},
    std::pair<char32_t, int16_t>{0x10E7E, 3},   std::pair<char32_t, int16_t>{0x10F26, 2},
    std::pair<char32_t, int16_t>{0x11FC0, 320}, std::pair<char32_t, int16_t>{0x11FC1, 160},
    std::pair<char32_t, int16_t>{0x11FC2, 80},  std::pair<char32_t, int16_t>{0x11FC3, 64},
    std::pair<char32_t, int16_t>{0x11FC4, 40},  std::pair<char32_t, int16_t>{0x11FC5, 32},
    std::pair<char32_t, int16_t>{0x11FC6, 80},  std::pair<char32_t, int16_t>{0x11FC7, 64},
    std::pair<char32_t, int16_t>{0x11FC8, 20},  std::pair<char32_t, int16_t>{0x11FC9, 16},
    std::pair<char32_t, int16_t>{0x11FCA, 16},  std::pair<char32_t, int16_t>{0x11FCB, 10},
    std::pair<char32_t, int16_t>{0x11FCC, 8},   std::pair<char32_t, int16_t>{0x11FCD, 20},
    std::pair<char32_t, int16_t>{0x11FCE, 16},  std::pair<char32_t, int16_t>{0x11FCF, 5},
    std::pair<char32_t, int16_t>{0x11FD0, 4},   std::pair<char32_t, int16_t>{0x11FD1, 2},
    std::pair<char32_t, int16_t>{0x11FD2, 2},   std::pair<char32_t, int16_t>{0x11FD3, 4},
    std::pair<char32_t, int16_t>{0x11FD4, 320}, std::pair<char32_t, int16_t>{0x1245A, 3},
    std::pair<char32_t, int16_t>{0x1245B, 3},   std::pair<char32_t, int16_t>{0x1245C, 6},
    std::pair<char32_t, int16_t>{0x1245D, 3},   std::pair<char32_t, int16_t>{0x1245E, 3},
    std::pair<char32_t, int16_t>{0x1245F, 8},   std::pair<char32_t, int16_t>{0x12460, 4},
    std::pair<char32_t, int16_t>{0x12461, 6},   std::pair<char32_t, int16_t>{0x12462, 4},
    std::pair<char32_t, int16_t>{0x12463, 4},   std::pair<char32_t, int16_t>{0x12464, 2},
    std::pair<char32_t, int16_t>{0x12465, 3},   std::pair<char32_t, int16_t>{0x12466, 3},
    std::pair<char32_t, int16_t>{0x1ECAD, 4},   std::pair<char32_t, int16_t>{0x1ECAE, 2},
    std::pair<char32_t, int16_t>{0x1ECAF, 4},   std::pair<char32_t, int16_t>{0x1ED3C, 2},
    std::pair<char32_t, int16_t>{0x1ED3D, 6},   std::pair<char32_t, int16_t>{0x110000, 0}};
enum class property {
    ahex,
    ascii_hex_digit = ahex,
    alpha,
    alphabetic = alpha,
    bidi_c,
    bidi_control = bidi_c,
    bidi_m,
    bidi_mirrored = bidi_m,
    cased,
    ci,
    case_ignorable = ci,
    dash,
    dep,
    deprecated = dep,
    di,
    default_ignorable_code_point = di,
    dia,
    diacritic = dia,
    emoji,
    emoji_component,
    emoji_modifier,
    emoji_modifier_base,
    emoji_presentation,
    ext,
    extender = ext,
    extended_pictographic,
    gr_base,
    grapheme_base = gr_base,
    gr_ext,
    grapheme_extend = gr_ext,
    hex,
    hex_digit = hex,
    idc,
    id_continue = idc,
    ideo,
    ideographic = ideo,
    ids,
    id_start = ids,
    idsb,
    ids_binary_operator = idsb,
    idst,
    ids_trinary_operator = idst,
    join_c,
    join_control = join_c,
    loe,
    logical_order_exception = loe,
    lower,
    lowercase = lower,
    math,
    nchar,
    noncharacter_code_point = nchar,
    pat_syn,
    pattern_syntax = pat_syn,
    pat_ws,
    pattern_white_space = pat_ws,
    pcm,
    prepended_concatenation_mark = pcm,
    qmark,
    quotation_mark = qmark,
    radical,
    ri,
    regional_indicator = ri,
    sd,
    soft_dotted = sd,
    sterm,
    sentence_terminal = sterm,
    term,
    terminal_punctuation = term,
    uideo,
    unified_ideograph = uideo,
    upper,
    uppercase = upper,
    vs,
    variation_selector = vs,
    wspace,
    white_space = wspace,
    space = wspace,
    xidc,
    xid_continue = xidc,
    xids,
    xid_start = xids,
    __max
};
static constexpr __range_array __prop_ahex_data = {0x00000000, 0x00003001, 0x00003A00, 0x00004101,
                                                   0x00004700, 0x00006101, 0x00006700};
static constexpr __bool_trie<32, 991, 1, 0, 166, 255, 1, 0, 1407, 1, 0, 125> __prop_alpha_data{
    {0x0000000000000000, 0x07fffffe07fffffe, 0x0420040000000000, 0xff7fffffff7fffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x0000501f0003ffc3,
     0x0000000000000000, 0xbcdf000000000020, 0xfffffffbffffd740, 0xffbfffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xfffffffffffffc03, 0xffffffffffffffff,
     0xfffeffffffffffff, 0xffffffff027fffff, 0xbfff0000000001ff, 0x000787ffffff00b6,
     0xffffffff07ff0000, 0xffffc000feffffff, 0xffffffffffffffff, 0x9c00e1fe1fefffff,
     0xffffffffffff0000, 0xffffffffffffe000, 0x0003ffffffffffff, 0x043007fffffffc00},
    {1,   2,   3,   4,   5,   6,   7,   8,   9,   10, 11,  12,  13,  14,  15,  16,  17,  18,  19,
     20,  21,  22,  23,  24,  25,  26,  27,  28,  29, 30,  31,  32,  33,  34,  35,  36,  36,  36,
     36,  36,  37,  38,  39,  40,  41,  42,  43,  44, 36,  36,  36,  36,  36,  36,  36,  36,  45,
     46,  47,  48,  49,  50,  51,  52,  53,  54,  55, 56,  57,  58,  59,  60,  61,  62,  31,  63,
     64,  65,  66,  67,  68,  69,  70,  36,  36,  36, 71,  36,  36,  36,  36,  72,  73,  74,  75,
     31,  76,  77,  31,  78,  79,  80,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  81,
     82,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 83,  84,  36,  85,  86,  87,  88,  89,  90,
     31,  31,  31,  31,  31,  31,  31,  91,  44,  92, 93,  94,  36,  95,  96,  31,  31,  31,  31,
     31,  31,  31,  31,  97,  31,  98,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  99,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  100, 31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  101, 31,  102, 103, 104, 105, 100, 106,
     31,  31,  31,  31,  31,  31,  107, 108, 31,  31, 31,  31,  31,  31,  109, 110, 109, 111, 31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 112, 31,  31,  31,  31,  31,  31,  31,  113,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  114, 31,  115, 116, 31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  117, 31,  118, 31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  119, 31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  120, 31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  121, 31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  117, 31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  120, 31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  122, 31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  123, 31,  106,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  124, 125, 31,
     126, 31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  127, 128, 36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  129, 130,
     36,  36,  36,  36,  131, 132, 36,  133, 134, 36, 135, 136, 137, 138, 36,  139, 140, 141, 142,
     143, 67,  144, 145, 146, 147, 148, 36,  149, 36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  150, 151, 31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  31,  31,  31,  31,  31,  31,
     31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 31,  31,  31,  36,  36,  36,  36,  36,  152,
     36,  153, 154, 155, 156, 157, 36,  36,  36,  36, 158, 33,  159, 160, 31,  161, 36,  162, 163,
     164, 145, 165},
    {0x00001ffffcffffff, 0x000007ff01ffffff, 0x3fdfffff00000000, 0xffff03f8fff00000,
     0xefffffffffffffff, 0xfffe000fffe1dfff, 0xe3c5fdfffff99fef, 0x1003000fb080599f,
     0xc36dfdfffff987ee, 0x003f00005e021987, 0xe3edfdfffffbbfee, 0x1e00000f00011bbf,
     0xe3edfdfffff99fee, 0x0002000fb0c0199f, 0xc3ffc718d63dc7ec, 0x0000000000811dc7,
     0xe3fffdfffffddfef, 0x0000000f07601ddf, 0xe3effdfffffddfef, 0x0006000f40601ddf,
     0xe7fffffffffddfef, 0xfc00000f80f05ddf, 0x2ffbfffffc7fffec, 0x000c0000ff5f807f,
     0x07fffffffffffffe, 0x000000000000207f, 0x3bffffaffffff7d6, 0x00000000f000205f,
     0x0000000000000001, 0xfffe1ffffffffeff, 0x1ffffffffeffff03, 0x0000000000000000,
     0xf97fffffffffffff, 0xffffffffffff0000, 0xffffffff3c00ffff, 0xf7ffffffffff20bf,
     0xffffffffffffffff, 0xffffffff3d7f3dff, 0x7f3dffffffff3dff, 0xffffffffff7fff3d,
     0xffffffffff3dffff, 0x0000000007ffffff, 0xffffffff0000ffff, 0x3f3fffffffffffff,
     0xfffffffffffffffe, 0xffff9fffffffffff, 0xffffffff07fffffe, 0x01ffc7ffffffffff,
     0x000fffff000fdfff, 0x000ddfff000fffff, 0xffcfffffffffffff, 0x00000000108001ff,
     0xffffffff00000000, 0x01ffffffffffffff, 0xffff07ffffffffff, 0x003fffffffffffff,
     0x01ff0fff7fffffff, 0x001f3fffffff0000, 0xffff0fffffffffff, 0x00000000000003ff,
     0xffffffff0fffffff, 0x001ffffe7fffffff, 0x0000008000000000, 0xffefffffffffffff,
     0x0000000000000fef, 0xfc00f3ffffffffff, 0x0003ffbfffffffff, 0x007fffffffffffff,
     0x3ffffffffc00e000, 0xe7ffffffffff01ff, 0x046fde0000000000, 0x001fff8000000000,
     0xffffffff3f3fffff, 0x3fffffffaaff3f3f, 0x5fdfffffffffffff, 0x1fdc1fff0fcf1fdc,
     0x8002000000000000, 0x000000001fff0000, 0xf3ffbd503e2ffc84, 0xffffffff000043e0,
     0x00000000000001ff, 0xffc0000000000000, 0x000003ffffffffff, 0xffff7fffffffffff,
     0xffffffff7fffffff, 0x000c781fffffffff, 0xffff20bfffffffff, 0x000080ffffffffff,
     0x7f7f7f7f007fffff, 0xffffffff7f7f7f7f, 0x0000800000000000, 0x1f3e03fe000000e0,
     0xfffffffee07fffff, 0xf7ffffffffffffff, 0xfffeffffffffffe0, 0x07ffffff00007fff,
     0xffff000000000000, 0x0000000000000028, 0x000000000000000a, 0x0000050000000000,
     0x0000000000002800, 0x0010000000000000, 0x00000000000003ab, 0x0000000028000000,
     0xa000000000741400, 0x00000140a0000001, 0x0001400000000000, 0x0000000000000014,
     0x00003e8000000050, 0x8000000000000000, 0x000000000000143e, 0x000000000000001e,
     0x000000000a000000, 0x0282800000000000, 0x0500000000000000, 0xd000000000000000,
     0x000000000001f400, 0x5000000000000000, 0x0000000000001400, 0x0000000000050000,
     0x0000000000000050, 0x0000000000500000, 0x0000140000000000, 0x000a500000000000,
     0x0000000280000000, 0x0140000000001450, 0x0050000000000000, 0x0400001000000000,
     0x0000420000101404, 0x0000000000001fff, 0x3fffffffffff0000, 0x00000c00ffff1fff,
     0x8ff07fffffffffff, 0x0000ffffffffffff, 0xfffffffcff800000, 0xfffffffffffff9ff,
     0xff8000000000007c, 0x000000ffffffffbf, 0x000fffffffffffff, 0xe8fc00000000002f,
     0xffff07fffffffc00, 0x1fffffff0007ffff, 0xfff7ffffffffffff, 0x7c00ffff00008000,
     0xfc7fffff00003fff, 0x7fffffffffffffff, 0x003cffff38000005, 0xffff7f7f007e7e7e,
     0xffff00fff7ffffff, 0x000007ffffffffff, 0xffff000fffffffff, 0x0ffffffffffff87f,
     0xffff3fffffffffff, 0x0000000003ffffff, 0x5f7ffdffe0f8007f, 0xffffffffffffffdb,
     0x0003ffffffffffff, 0xfffffffffff80000, 0x3fffffffffffffff, 0xfffffffffffcffff,
     0x0fff0000000000ff, 0xffdf000000000000, 0x1fffffffffffffff, 0x07fffffe00000000,
     0xffffffc007fffffe, 0x000000001cfcfcfc},
    {1,  2,  3, 4,  5,  6, 7, 8, 5, 5, 9, 5, 10, 11, 12, 13, 5, 14, 15, 5, 5, 16, 5, 5, 5, 17,
     18, 19, 5, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5},
    {1,   2,   3,  4,   5,  4,  4,   4,   4,  6,   7,  8,   9,   10,  11,  2,   2,  12, 13, 14,
     15,  4,   4,  2,   2,  2,  2,   16,  17, 4,   4,  18,  19,  20,  21,  22,  4,  23, 4,  24,
     25,  26,  27, 28,  29, 30, 4,   2,   31, 32,  32, 33,  4,   4,   4,   4,   4,  4,  4,  34,
     35,  4,   36, 2,   35, 37, 38,  32,  39, 2,   40, 41,  4,   42,  43,  44,  45, 4,  4,  2,
     46,  2,   47, 4,   4,  48, 49,  50,  51, 52,  4,  53,  4,   4,   4,   54,  4,  55, 56, 4,
     4,   57,  58, 59,  60, 61, 54,  4,   4,  4,   4,  62,  63,  64,  4,   65,  66, 67, 4,  4,
     4,   4,   36, 4,   4,  4,  4,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   68,  4,  2,   69, 2,  2,   2,   70, 4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   2,   2,  2,   2,  2,  2,   69,  4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     71,  4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,  2,
     2,   2,   2,  54,  20, 4,  72,  73,  74, 75,  4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     2,   4,   4,  2,   76, 77, 78,  2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   2,   2,  2,   2,  2,  2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   2,   2,  2,   2,  2,  2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   2,   2,  2,   2,  2,  2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   2,   2,  2,   2,  2,  2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,
     2,   2,   79, 2,   2,  2,  2,   2,   2,  2,   2,  2,   2,   2,   32,  4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,  20,
     80,  2,   2,  2,   2,  2,  81,  4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  2,   82, 83, 4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   84, 85, 86, 87,
     88,  2,   2,  2,   2,  89, 90,  91,  92, 93,  94, 4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  95,  4,  4,  4,   96,  97, 4,   4,  4,   4,   4,   98,  4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  99, 2,
     100, 4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  101,
     102, 103, 4,  4,   4,  4,  4,   4,   4,  4,   4,  104, 105, 106, 4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  107, 108, 4,   109, 110, 4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   111, 4,  112, 4,  4,   4,   4,   113, 114, 4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  115, 4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   116, 4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  117, 4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   118, 4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   119, 4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  120,
     4,   4,   4,  121, 4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   122, 4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  123, 4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,  2,
     2,   2,   2,  124, 4,  4,  4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,
     4,   4,   4,  4,   4,  4,  4},
    {0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff,
     0x0000000000000000, 0x001fffffffffffff, 0xffffffff1fffffff, 0x000000000001ffff,
     0xffffe000ffffffff, 0x07ffffffffff07ff, 0xffffffff3fffffff, 0x00000000003eff0f,
     0xffff00003fffffff, 0x0fffffffff0fffff, 0xffff00ffffffffff, 0x0000000fffffffff,
     0x007fffffffffffff, 0x000000ff003fffff, 0x91bffffffffffd3f, 0x007fffff003fffff,
     0x000000007fffffff, 0x0037ffff00000000, 0x03ffffff003fffff, 0xc0ffffffffffffff,
     0x003ffffffeeff06f, 0x1fffffff00000000, 0x000000001fffffff, 0x0000001ffffffeff,
     0x003fffffffffffff, 0x0007ffff003fffff, 0x000000000003ffff, 0x00000000000001ff,
     0x0007ffffffffffff, 0x000000ffffffffff, 0xffff00801fffffff, 0x000000000000003f,
     0x007fffff00000000, 0x01fffffffffffffc, 0x000001ffffff0000, 0x0047ffffffff0070,
     0x000000001400001e, 0x409ffffffffbffff, 0xffff01ffbfffbd7f, 0x000001ffffffffff,
     0xe3edfdfffff99fef, 0x0000000fe081199f, 0x00000000800007bb, 0x00000000000000b3,
     0x7f3fffffffffffff, 0x000000003f000000, 0x7fffffffffffffff, 0x0000000000000011,
     0x013fffffffffffff, 0x000007ffe7ffffff, 0x01ffffffffffffff, 0xffffffff00000000,
     0x80000000ffffffff, 0xfffffcff00000000, 0x0000001afcffffff, 0x7fe7ffffffffffff,
     0xffffffffffff0000, 0x0000000020ffffff, 0x7f7ffffffffffdff, 0xfffc000000000001,
     0x007ffefffffcffff, 0xb47ffffffffffb7f, 0xfffffdbf000000cb, 0x00000000017b7fff,
     0x0000000003ffffff, 0x00007fffffffffff, 0x000000000000000f, 0x000000000000007f,
     0x00003fffffff0000, 0x0000ffffffffffff, 0xe0fffff80000000f, 0x000000000000ffff,
     0xffffffffffff87ff, 0x00000000ffff80ff, 0x0000000b00000000, 0x00ffffffffffffff,
     0xffff00f000070000, 0x0fffffffffffffff, 0x1fff07ffffffffff, 0x0000000043ff01ff,
     0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef, 0x7bffffffdfdfe7bf,
     0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xf7fffffff7fffffd, 0xffdfffffffdfffff,
     0xffff7fffffff7fff, 0xfffffdfffffffdff, 0x0000000000000ff7, 0x000007dbf9ffff7f,
     0x3f801fffffffffff, 0x0000000000004000, 0x00000fffffffffff, 0x000000000000001f,
     0x000000000000088f, 0x0af7fe96ffffffef, 0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff,
     0xffff000000000000, 0xffff03ffffff03ff, 0x00000000000003ff, 0x0000000000000003,
     0x0000001400000000, 0x0000000500000000, 0x0000000280000000, 0x0000050000000000,
     0x000000001400140a, 0x2800050000000000, 0x0000000002800000, 0x0000000000014000,
     0x0000000001400000, 0x000000000a000000, 0x0000280000000000, 0x0000000000200000,
     0x0008000000000000, 0x0000000010000000, 0x0000000100000000, 0x0000000080000000,
     0x000000003fffffff}};
static constexpr __range_array __prop_bidi_c_data = {0x00000000, 0x00061C01, 0x00061D00,
                                                     0x00200E01, 0x00201000, 0x00202A01,
                                                     0x00202F00, 0x00206601, 0x00206A00};
static constexpr __bool_trie<32, 962, 28, 2, 26, 1, 13, 242, 5, 91, 32, 6> __prop_bidi_m_data{
    {0x5000030000000000, 0x2800000028000000, 0x0800080000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  2,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 3, 4,  5,  0, 0,  6, 0, 0, 7, 8, 9,  10, 11,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  12, 0, 13, 0, 0, 0, 0, 0, 0,  14, 15,
     16, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0,  0, 0, 0,  21, 0, 0,  0, 0, 0, 0, 0, 22, 0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0, 0,  0,  0,
     0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0, 0, 23, 0, 0, 24, 25},
    {0x0000000000000000, 0x3c00000000000000, 0x0000000018000000, 0x0600000000000000,
     0x6000000000000060, 0x0000000000006000, 0x0000000000000001, 0xfa0ff857bc623f1e,
     0xffffcff5803c1fff, 0xc1ffffcc01079fff, 0xffff3fffffc33e00, 0x0000060300000f00,
     0x003fff0000000000, 0x0000fffc70783b79, 0x0100fffdf9fffff8, 0x33f0033a1f37c23f,
     0x70307a53dffffc00, 0xfe19bc3001800000, 0xffffbfcfffffffff, 0x2f88707c507fffff,
     0x4000000000000000, 0x000003ff3000363c, 0x000000000ff3ff00, 0x000000307e000000,
     0x2800000050000300, 0x0000000da8000000},
    {1},
    {1, 2, 3, 4, 5},
    {0x0000000000000000, 0x0000000008000000, 0x0000000000200000, 0x0000000000008000,
     0x0000000000000200, 0x0000000000000008}};
static constexpr __bool_trie<0, 969, 5, 18, 11, 1, 13, 242, 3, 69, 56, 4> __prop_ce_data{
    {},
    {1, 0, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 9, 10},
    {0x0000000000000000, 0x00000000ff000000, 0x00000000b0000000, 0x0048000000000000,
     0x000000004e000000, 0x0000000030000000, 0x0140020010842008, 0x0200108420080000,
     0x0000000010000000, 0x5f7ffc00a0000000, 0x0000000000007fdb},
    {1},
    {1, 2, 3},
    {0x0000000000000000, 0x0000001fc0000000, 0xf800000000000000, 0x0000000000000001}};
static constexpr __bool_trie<32, 969, 5, 18, 21, 19, 13, 224, 100, 69, 23, 6> __prop_comp_ex_data{
    {0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x401000000000001b, 0x0000000000000080, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1, 0, 2, 3, 4, 0, 0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 6, 7, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 8, 9, 10, 11, 0,  0,  0,  12, 0,  0,  0,  0,  0, 0, 0, 13, 0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 14, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0,  15, 15, 15, 15, 16, 17, 15, 18, 19, 20},
    {0x0000000000000000, 0x00000000ff000000, 0x00000000b0000000, 0x0048000000000000,
     0x000000004e000000, 0x0000000030000000, 0x0168020010842008, 0x0200108420080002,
     0x2aaa000000000000, 0x4800000000000000, 0x2a00c80808080a00, 0x0000000000000003,
     0x00000c4000000000, 0x0000060000000000, 0x0000000010000000, 0xffffffffffffffff,
     0xfffffc657fe53fff, 0xffff3fffffffffff, 0x0000000003ffffff, 0x5f7ffc00a0000000,
     0x0000000000007fdb},
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2},
    {1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 5},
    {0x0000000000000000, 0x0000001fc0000000, 0xf800000000000000, 0x0000000000000001,
     0xffffffffffffffff, 0x000000003fffffff}};
static constexpr flat_array<28> __prop_dash_data{
    {0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2010, 0x2011, 0x2012, 0x2013, 0x2014,
     0x2015, 0x2053, 0x207B, 0x208B, 0x2212, 0x2E17, 0x2E1A, 0x2E3A, 0x2E3B, 0x2E40,
     0x301C, 0x3030, 0x30A0, 0xFE31, 0xFE32, 0xFE58, 0xFE63, 0xFF0D}};
static constexpr flat_array<15> __prop_dep_data{{0x0149, 0x0673, 0x0F77, 0x0F79, 0x17A3, 0x17A4,
                                                 0x206A, 0x206B, 0x206C, 0x206D, 0x206E, 0x206F,
                                                 0x2329, 0x232A, 0xE0001}};
static constexpr __bool_trie<32, 991, 1, 0, 60, 255, 1, 0, 347, 11, 26, 32> __prop_dia_data{
    {0x0000000000000000, 0x0000000140000000, 0x0190810000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0xffff000000000000, 0xffffffffffffffff,
     0xffffffffffffffff, 0x04300007e0ff7fff, 0x0000000000000030, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x00000000000000f8, 0x0000000000000000,
     0x0000000000000000, 0x0000000002000000, 0xbffffffbfffe0000, 0x0000000000000016,
     0x0000000000000000, 0x000000000187f800, 0x0000000000000000, 0x00001c6180000000,
     0xffff000000000000, 0x00000000000007ff, 0x0001ffc000000000, 0x003ff80000000000},
    {1,  1,  2,  3,  4,  3,  5,  3,  5,  3,  6,  3,  5,  1,  5,  1,  5, 3,  5,  7,  5,  1,  8,  1,
     9,  10, 11, 12, 1,  13, 14, 15, 16, 17, 1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  18, 1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  19, 1,  1, 1,  1,  20, 1,  1,  1,  1,
     21, 22, 1,  23, 24, 25, 1,  26, 27, 1,  28, 29, 30, 1,  31, 1,  1, 1,  1,  1,  1,  32, 33, 1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  34, 1,  1,  1,  1,  35, 1,  1,  1,  1,  1,  1,  1,  36, 1, 37, 3,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  38, 39, 40, 41, 1,  42, 43, 1,  1, 1,  44, 45, 46, 47, 48, 1,
     49, 50, 51, 1,  52, 1,  53, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  54, 1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  55,
     1,  1,  1,  56, 57, 58, 59},
    {0x0000000003000000, 0x0000000000000000, 0x7ffffff800000000, 0x1000000000000000,
     0x00020000001e2000, 0x0000000000002000, 0xe000000000002000, 0x1800000000000000,
     0x0000000000000400, 0x0000000000005f80, 0x0400000000000000, 0x0000000000001f00,
     0xc2a0000003000000, 0x00000000000000dc, 0x0000000000000040, 0x0680000000000000,
     0x00003e1800000000, 0x000000000c00bf80, 0x00000000e0000000, 0x00000000200ffe00,
     0x0e00000000000000, 0x9fe0000000000000, 0x3fff000000000000, 0x0010000000000000,
     0x000ff80000000010, 0x00000c0000000000, 0x00c0000000000000, 0x3f00000000000000,
     0x039021ffffff0000, 0xfffff00000000000, 0x000007ffffffffff, 0xe3e000000000fff0,
     0xa000000000000000, 0x6000e000e000e003, 0x0003800000000000, 0x0000800000000000,
     0x0000fc0000000000, 0x000000001e000000, 0xb000800000000000, 0x0000000030000000,
     0x0003000000000000, 0x00000003ffffffff, 0x0000000000000700, 0x0300000000000000,
     0x0003ffff00000010, 0x0000780000000000, 0x0000000000080000, 0x0008000000000000,
     0x0000002000000001, 0x3800000000000000, 0x8000000000000000, 0x0040000000000007,
     0x00000000f8000000, 0x0000300000000000, 0x0000000040000000, 0x0000ffff00000000,
     0x4000000000000000, 0x0001000000000001, 0x00000000c0000000, 0x0000000800000000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  2,  0, 0, 0, 0, 0, 0,  0,  0,  3,  0, 0,  0,  0,  0, 0,  0, 0,
     4,  0,  0,  0, 0,  5, 0,  6,  7, 0, 8, 9, 0, 0,  10, 11, 12, 0, 0,  0,  13, 0, 14, 0, 0,
     15, 16, 15, 0, 17, 0, 18, 0,  0, 0, 5, 0, 0, 0,  0,  0,  0,  1, 19, 20, 21, 0, 0,  0, 0,
     0,  15, 0,  0, 0,  0, 22, 23, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 24,
     25, 0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 26, 0,  0,  0, 0,  0, 0,
     27, 28, 0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 25, 0,  0,  0,  0, 0,  0,  29, 0, 0,  0, 0,
     0,  0,  0,  0, 0,  0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0,  30, 0,  31},
    {0x0000000000000000, 0x0000000100000000, 0x0000006000000000, 0x000000fc00000000,
     0x000000000001ffc0, 0x0600000000000000, 0x0018000000000000, 0x0008000000000000,
     0x0000000000001c01, 0x0060000000000000, 0x0000060000000000, 0x1000000000000000,
     0x001f1fc000002000, 0x0000000000000044, 0x000000000000000c, 0x8000000000000000,
     0x0000000000000001, 0x00c0000000000000, 0x0000080000000000, 0x0010000000000000,
     0x0000000000000080, 0x0000000002000000, 0x0000000000000034, 0x0000000000800000,
     0x001f000000000000, 0x007f000000000000, 0x00000000ffff8000, 0xf807e38000000000,
     0x00003c0000000fe7, 0x0000f00000000000, 0x00000000007f0000, 0x0000000000000770}};
static constexpr __bool_trie<32, 39, 102, 851, 15, 1, 15, 240, 38, 69, 21, 28> __prop_emoji_data{
    {0x03ff000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1, 0, 0,  0,  0,  0, 2, 0, 0, 3, 0,  0, 0, 0, 0, 0, 4, 5, 6, 7,
     8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14},
    {0x0000000000000000, 0x0000060003f00000, 0x000000000c000000, 0x070ffe0000000000,
     0x00000c0000000000, 0x7800000000000000, 0x0700c00c0030001f, 0xc0000061800fff00,
     0x60030c0318fc0000, 0x07bf060000180030, 0x0018000000003f00, 0x0000001800380000,
     0x0000000000e00000, 0x0030000000000000, 0x00000000180000e0},
    {1},
    {1,  2,  3,  4,  5, 0, 0, 6,  7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
     18, 19, 12, 20, 0, 0, 0, 21, 0, 0, 0, 0,  22, 23, 24, 25, 0,  26, 27},
    {0x0000000000000000, 0x0003000000000000, 0x0000000007fe0000, 0xffffffc000000000,
     0x07fc000000000006, 0x0000000000030000, 0xffbffff1ffffffff, 0xdfffffffffffffff,
     0xffffffffcecfffff, 0xff39ffffffffffdf, 0x7fffffffffffffff, 0xfffffffffffffffc,
     0xffffffffffffffff, 0x1effffffffffffff, 0x3fffffffffffffff, 0x03f980ffffff7e00,
     0x0006000000603c00, 0xf8000000700e001c, 0xffefcfff701dfffe, 0x000000000000ffff,
     0x01f0183f0006f83f, 0x00000fff00000000, 0x77feffff7fffe000, 0xf079ffffffffefbf,
     0xffffc7e7ffffffff, 0xffffffffffffe7fe, 0x070f000000000000, 0x00000000003f0007}};
static constexpr __range_array __prop_emoji_component_data = {
    0x00000000, 0x00003001, 0x00003A00, 0x01F1E601, 0x01F20000, 0x01F3FB01,
    0x01F40000, 0x01F9B001, 0x01F9B400, 0x0E002001, 0x0E008000};
static constexpr __range_array __prop_emoji_modifier_data = {0x00000000, 0x01F3FB01, 0x01F40000};
static constexpr __range_array __prop_emoji_modifier_base_data = {
    0x00000000, 0x00270A01, 0x00270E00, 0x01F3C201, 0x01F3C500, 0x01F3CB01, 0x01F3CD00,
    0x01F44201, 0x01F44400, 0x01F44601, 0x01F45100, 0x01F46601, 0x01F47900, 0x01F48101,
    0x01F48400, 0x01F48501, 0x01F48800, 0x01F57401, 0x01F57600, 0x01F59501, 0x01F59700,
    0x01F64501, 0x01F64800, 0x01F64B01, 0x01F65000, 0x01F6B401, 0x01F6B700, 0x01F91901,
    0x01F91F00, 0x01F93101, 0x01F93A00, 0x01F93C01, 0x01F93F00, 0x01F9B501, 0x01F9B700,
    0x01F9B801, 0x01F9BA00, 0x01F9CD01, 0x01F9D000, 0x01F9D101, 0x01F9DE00};
static constexpr __bool_trie<0, 33, 108, 851, 12, 1, 15, 240, 37, 70, 21, 27>
    __prop_emoji_presentation_data{
        {},
        {1, 0,  0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, 7, 8,
         9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11},
        {0x0000000000000000, 0x000000000c000000, 0x00001e0000000000, 0x6000000000000000,
         0x0000000000300000, 0x00000000000fff00, 0x60000c0000000000, 0x000c000000000030,
         0x0000000000000c00, 0x0000000000380000, 0x0000000000e00000, 0x0000000018000000},
        {1},
        {1,  2,  3,  4, 0, 0, 5,  6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
         18, 11, 19, 0, 0, 0, 20, 0, 0, 0, 0, 21, 22, 23, 24, 0,  25, 26},
        {0x0000000000000000, 0x0000000007fe0000, 0xffffffc000000000, 0x077c000000000000,
         0x0000000000030000, 0xffbfe001ffffffff, 0xdfffffffffffffff, 0xffffffff000fffff,
         0xff01ffff000f87df, 0x7fffffffffffffff, 0xfffffffffffffffc, 0xffffffffffffffff,
         0x1effffffffffffff, 0x3fffffffffffffff, 0x000000ffffff7800, 0x0000000000600000,
         0xf800000000000000, 0xffefcfff701dfffe, 0x000000000000ffff, 0x01f018000006003f,
         0x00000fff00000000, 0x77feffff7fffe000, 0xf079ffffffffefbf, 0xffffc7e7ffffffff,
         0xffffffffffffe7fe, 0x070f000000000000, 0x00000000003f0007}};
static constexpr flat_array<47> __prop_ext_data{
    {0x00B7,  0x02D0,  0x02D1,  0x0640,  0x07FA,  0x0E46,  0x0EC6,  0x180A,  0x1843,  0x1AA7,
     0x1C36,  0x1C7B,  0x3005,  0x3031,  0x3032,  0x3033,  0x3034,  0x3035,  0x309D,  0x309E,
     0x30FC,  0x30FD,  0x30FE,  0xA015,  0xA60C,  0xA9CF,  0xA9E6,  0xAA70,  0xAADD,  0xAAF3,
     0xAAF4,  0xFF70,  0x1135D, 0x115C6, 0x115C7, 0x115C8, 0x11A98, 0x16B42, 0x16B43, 0x16FE0,
     0x16FE1, 0x16FE3, 0x1E13C, 0x1E13D, 0x1E944, 0x1E945, 0x1E946}};
static constexpr __bool_trie<0, 39, 102, 851, 15, 1, 15, 240, 43, 64, 21, 28>
    __prop_extended_pictographic_data{
        {},
        {1, 0, 0,  0,  0,  0, 2, 0, 0, 3, 0,  0, 0, 0, 0, 0, 4, 5, 6, 7,
         8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14},
        {0x0000000000000000, 0x0000060003f00000, 0x000000000c000000, 0x070ffe0000000000,
         0x00000c0000000000, 0x7800000000000000, 0xfffffffffcf7ffbf, 0xffffffffffffffff,
         0xfffbffffdfff003f, 0xfffffff3ffffbfff, 0x001800000007ff1e, 0x000000f800380000,
         0x0000000000e00000, 0x0030000000000000, 0x00000000180000e0},
        {1},
        {1,  2, 3,  4,  0, 5,  6, 0, 7, 8,  0, 0, 9, 10, 2,  11, 12, 13, 2, 14, 15, 16,
         17, 2, 18, 19, 2, 20, 0, 0, 0, 21, 0, 0, 0, 0,  22, 23, 24, 25, 2, 26, 27},
        {0x0000000000000000, 0xffff0fffffffffff, 0xffffffffffffffff, 0x7ffe7fff000fffff,
         0x003ffffffffefffe, 0x0003000000000000, 0x0000000007fe0000, 0x07fc000000000006,
         0x0000003f00030000, 0xffbfffffffffffff, 0xdfffffffffffffff, 0x07ffffffffffffdf,
         0x7fffffffffffffff, 0xfffffffffffffffc, 0x7effffffffffffff, 0x3fffffffffffffff,
         0xfbffffffffffffc0, 0xffffffefffffffff, 0xffefcfff701dfffe, 0x000000000000ffff,
         0x01ff1fff001effff, 0x00000fff01e00000, 0x77feffff7fffe000, 0xf079ffffffffefbf,
         0xffffc7e7ffffffff, 0xffffffffffffe7fe, 0x070f3fff000fffff, 0x00000000003f0007}};
static constexpr __bool_trie<32, 991, 1, 0, 165, 255, 1, 0, 1407, 1, 0, 170> __prop_gr_base_data{
    {0xffffffff00000000, 0x7fffffffffffffff, 0xffffdfff00000000, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0x0000000000000000, 0xfcff000000000000, 0xfffffffbffffd7f0, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xfffffffffffffc07, 0xffffffffffffffff,
     0xfffeffffffffffff, 0xfffffffffe7fffff, 0x400000000000e7ff, 0x001f87ffffff0049,
     0xffffffffc800ffc0, 0xfffeffff000007ff, 0xffffffffffffffff, 0xffffc260403fffff,
     0x0000fffffffd3fff, 0xffffffffffffe000, 0x0002003fffffffff, 0xc7f007ffffffffff},
    {1,   2,   3,   4,   5,   6,   7,   8,   9,   10, 11,  12,  13,  14,  15,  16,  17,  18,  19,
     20,  21,  22,  23,  24,  25,  26,  27,  28,  29, 30,  31,  32,  33,  34,  35,  36,  36,  36,
     36,  36,  37,  38,  39,  40,  41,  42,  43,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     44,  45,  46,  47,  48,  49,  50,  45,  51,  52, 53,  54,  55,  56,  57,  58,  59,  3,   60,
     61,  62,  63,  64,  65,  66,  67,  36,  36,  36, 3,   36,  36,  36,  36,  68,  69,  70,  71,
     72,  73,  74,  3,   36,  36,  75,  36,  36,  36, 36,  36,  36,  36,  36,  36,  76,  77,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  78,  79,  36, 80,  81,  36,  82,  83,  84,  85,  86,  36,
     87,  88,  89,  36,  36,  36,  90,  91,  92,  93, 36,  94,  36,  95,  96,  81,  36,  36,  97,
     36,  36,  36,  36,  98,  3,   99,  3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   100, 3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   101, 3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   102, 36,  103, 104, 105, 106, 101, 107,
     3,   3,   3,   3,   3,   3,   108, 109, 3,   3,  3,   3,   3,   3,   110, 111, 110, 112, 3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  113, 3,   3,   3,   3,   3,   3,   3,   114,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   115, 3,   116, 117, 3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   118, 3,   119, 3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   120, 3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   121, 3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   122, 3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   118, 3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   121, 3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   123, 3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   124, 3,   107,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   125, 126, 3,
     127, 3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   128, 129, 36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  130, 131,
     36,  36,  36,  36,  132, 133, 134, 135, 36,  36, 36,  136, 137, 138, 36,  139, 140, 141, 142,
     143, 144, 145, 146, 147, 148, 149, 36,  150, 36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  36,  36,  36,  36,  36,  36,  36,
     36,  36,  36,  36,  36,  36,  36,  36,  36,  36, 36,  36,  96,  151, 3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   36,  36,  36,  36,  36,  152,
     36,  153, 154, 155, 36,  156, 36,  36,  36,  36, 36,  157, 158, 159, 160, 161, 36,  162, 92,
     36,  163, 164},
    {0x7fff0110043fffff, 0x000007ff41ffffff, 0x3fdfffff00000000, 0x0000000000000000,
     0xebfffffffffffff8, 0xfffffff3ff01de01, 0xa3c5fdfffff99fed, 0x3fffffc3b0005981,
     0xc36dfdfffff987e8, 0x005cffc05e000001, 0xe3edfdfffffbbfe8, 0x0203ffc300011a01,
     0x23edfdfffff99fec, 0x00ffffc3b0001981, 0x83ffc718d63dc7e8, 0x07ffffc000011dc6,
     0x23fffdfffffddfee, 0xff80ffc30700001e, 0x63effdfffffddffd, 0x0006ffc340000d9b,
     0xa7fffffffffddfec, 0xffffffc3ff70ddc1, 0x2ffbfffffc7fffec, 0x001cffc07f03007f,
     0x800dfffffffffffe, 0x000000000fff807f, 0x200dffaffffff7d6, 0x00000000f3ff005f,
     0xfd5ffffffcffffff, 0x80001ffffffffeff, 0xc000000000001f20, 0x0000000007ffdfbf,
     0x99021fffffffffff, 0xffe1fffe3cffffff, 0xffffffffdfffdf9b, 0xffffffffffff20bf,
     0xffffffffffffffff, 0xffffffff3d7f3dff, 0x7f3dffffffff3dff, 0xffffffffff7fff3d,
     0xffffffffff3dffff, 0x1fffffff07ffffff, 0xffffffff03ffffff, 0x3f3fffffffffffff,
     0xffffffff1fffffff, 0x01ffffffffffffff, 0x0063ffff0003dfff, 0x0001dfff0003ffff,
     0xc04fffffffffffff, 0x03ff03ff1ff001bf, 0xffffffff03ff07ff, 0xffff05ffffffff9f,
     0x003fffffffffffff, 0x01fb0e787fffffff, 0x001f3ffffffffff1, 0xffff0fffffffffff,
     0xffffffffc7ff03ff, 0xffffffffc67fffff, 0x0007e01a00bfffff, 0x00003fff03ff03ff,
     0xe80ffffffffffff0, 0x1ff007ffffff0ffb, 0xffffc4c3fffffffc, 0xf00c5cbfffffffff,
     0xf8300fffffffffff, 0xffffffffffffe3ff, 0xe7ffffffffff01ff, 0x04efde02000800ff,
     0xffffffff3f3fffff, 0x3fffffffaaff3f3f, 0xffdfffffffffffff, 0x7fdcffffefcfffdf,
     0xffff80ffffff07ff, 0xfff30000ffffffff, 0xffffffff1fff7fff, 0xffffffffffff0fff,
     0x0000007fffffffff, 0xffffffff000007ff, 0xffcfffffffffffff, 0xffffffffff3fffff,
     0xffff7fffffffffff, 0xffffffff7fffffff, 0xfe0c7fffffffffff, 0xffff20bfffffffff,
     0x000180ffffffffff, 0x7f7f7f7f007fffff, 0x000000007f7f7f7f, 0x000000000000ffff,
     0xfffffffffbffffff, 0x000fffffffffffff, 0x0fff0000003fffff, 0xffff03ffffffffff,
     0xfffffffffffffffe, 0xfffffffff87fffff, 0xfffeffffffffffe0, 0x07ffffffffff7fff,
     0xffff000fffffffff, 0x7fffffffffffffff, 0x0000000000000028, 0x000000000000000a,
     0x0000050000000000, 0x0000000000002800, 0x0010000000000000, 0x00000000000003ab,
     0x0000000028000000, 0xa000000000741400, 0x00000140a0000001, 0x0001400000000000,
     0x0000000000000014, 0x00003e8000000050, 0x8000000000000000, 0x000000000000143e,
     0x000000000000001e, 0x000000000a000000, 0x0282800000000000, 0x0500000000000000,
     0xd000000000000000, 0x000000000001f400, 0x5000000000000000, 0x0000000000001400,
     0x0000000000050000, 0x0000000000000050, 0x0000000000500000, 0x0000140000000000,
     0x000a500000000000, 0x0000000280000000, 0x0140000000001450, 0x0050000000000000,
     0x0400001000000000, 0x0000420000101404, 0xffffffffffff1fff, 0xffffffffffff007f,
     0x00000fffffffffff, 0xc0087fffffffffff, 0xffffffff3fffffff, 0x00fcffffffffffff,
     0xff8000000000007c, 0x03ff0f9ffffff7bb, 0x00ffffffffffffff, 0x7ffc000003ffc00f,
     0xffffc03fffffffff, 0x1fffffff800c007f, 0xcc37fffffffffff8, 0x7fffffdfc3ffbfff,
     0x001981ffffffffff, 0xeffffffff3ff2ff7, 0x3e62ffffffffffff, 0x003fcffff8000005,
     0xffff7f7f007e7e7e, 0xffff00ffffffffff, 0x03ff1edfffffffff, 0x0ffffffffffff87f,
     0xffff3fffffffffff, 0x0000000003ffffff, 0x5f7fffffa0f8007f, 0xffffffffffffffdb,
     0xfffffffffff80003, 0xffffffffffff0000, 0xfffffffffffcffff, 0x3fff0000000000ff,
     0xffff000003ff0000, 0xffdf0f7ffff7ffff, 0x1fffffffffffffff, 0x7fffffff3fffffff,
     0x30007f7f1cfcfcfc},
    {1,  2,  3, 4,  5,  6, 7, 8, 5, 5, 9, 5, 10, 11, 12, 13, 5, 14, 15, 5, 5, 16, 5, 5, 5, 17,
     18, 19, 5, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5},
    {1,   2,   3,   4,   2,   5,   6,   7,   7,   8,   9,   10,  11,  12,  13,  2,   2,   14,  15,
     16,  17,  7,   7,   2,   2,   2,   2,   18,  19,  7,   7,   20,  21,  22,  23,  24,  7,   25,
     26,  27,  28,  29,  30,  31,  32,  33,  7,   2,   34,  35,  36,  37,  7,   7,   7,   7,   38,
     7,   7,   16,  39,  7,   40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  7,   50,  51,  52,
     53,  7,   7,   54,  55,  56,  57,  7,   7,   58,  59,  60,  61,  62,  63,  64,  7,   7,   7,
     65,  7,   66,  67,  7,   7,   68,  69,  70,  71,  72,  73,  7,   7,   7,   7,   74,  75,  76,
     7,   77,  78,  79,  7,   7,   7,   7,   80,  7,   7,   7,   81,  2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   82,  7,   2,   83,  2,   2,   2,   84,  7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   85,  7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   2,   2,   2,   2,   2,   2,   2,   2,   2,   86,  7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   2,   2,
     2,   2,   2,   2,   2,   73,  87,  7,   88,  89,  90,  91,  7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   2,   92,  7,   2,   93,  94,  95,  2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   54,  2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   35,  7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   2,   2,   2,   2,   96,  97,  2,   2,   2,   2,   2,   98,  7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   99,  100, 7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   2,   2,   101, 102, 103, 104,
     105, 2,   106, 7,   107, 2,   108, 7,   7,   2,   109, 110, 111, 112, 113, 2,   2,   2,   2,
     114, 2,   2,   2,   2,   115, 2,   2,   2,   2,   2,   2,   2,   2,   116, 117, 118, 7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   119, 120, 7,   7,   7,   7,   7,   121, 7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   2,   2,   122, 2,   123,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   124, 125, 7,   126, 7,   7,   7,   127,
     128, 129, 130, 7,   7,   7,   7,   131, 2,   132, 133, 134, 135, 136, 137, 138, 139, 7,   7,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   140, 2,   141, 2,
     142, 143, 144, 145, 7,   146, 147, 148, 149, 2,   150, 151, 7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   152, 153, 7,   154, 155,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   156, 7,   157, 7,   7,   7,   7,
     158, 159, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   160, 7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   161, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   162, 7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   163, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   164, 7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   165, 7,   7,   7,   166, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     167, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   168, 7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   2,   2,   2,   2,   2,   2,   2,   2,   169, 7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7},
    {0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff,
     0xff8fffffffffff87, 0x000000010fff7fff, 0x1fffffffffff0000, 0x0000000000000000,
     0xffffffff1fffffff, 0x0ffffffe0001ffff, 0xffffe00fffffffff, 0x003fffffffff07ff,
     0xffffffffbfffffff, 0x00000000003fff0f, 0xffff03ff3fffffff, 0x0fffffffff0fffff,
     0xffff00ffffffffff, 0x0000800fffffffff, 0x007fffffffffffff, 0x000000ff003fffff,
     0x91bffffffffffd3f, 0xffffffffffbfffff, 0x0000ff807fffffff, 0xf837ffff00000000,
     0x83ffffff8fffffff, 0xf0ffffffffffffff, 0xfffffffffffcffff, 0x003ffffffeef0001,
     0xffffffff01ff01ff, 0x00000000ffffffff, 0x007ff81fffffffff, 0xfe3fffffffffffff,
     0xff07ffffff3fffff, 0x0000fe001e03ffff, 0x00000000000001ff, 0x0007ffffffffffff,
     0xfc07ffffffffffff, 0x03ff000fffffffff, 0x7fffffff00000000, 0x0000000003fe003f,
     0x007fffff00000000, 0x00fffffffffffffd, 0x0000fffffffc3f80, 0xd987fffffffffffc,
     0x03ff01ffffff0003, 0xffc0107ffffffff8, 0x0077ffffffff007f, 0x803ffffffffffffc,
     0x001ffffeffff21ff, 0x3f2c7ffffffbffff, 0xffff03ffbfffbd7f, 0x03ff00077fffffff,
     0xa3edfdfffff99fec, 0x0000000fe001399e, 0x00ffffffffffffff, 0x00000000abffffa3,
     0x5a06ffffffffffff, 0x0000000003ff00f2, 0x4f037fffffffffff, 0x000000000ffffffe,
     0x5807ffffffffffff, 0x00001fff03ff001e, 0x0140d7ffffffffff, 0x00000000000003ff,
     0xffff004307ffffff, 0x09007fffffffffff, 0xffffffff00000000, 0x8007ffffffffffff,
     0xfffffcff00000000, 0x0000001ef00fffff, 0x8607fffffffff801, 0xfffffffff181007f,
     0x00000007fc8003ff, 0x01ffffffffffffff, 0x4000fffffffffdff, 0xffff1fffffff003f,
     0x001202000000ffff, 0x0001fffffffffb7f, 0xfffffdbf03ff0040, 0x000003ff01587fff,
     0x01e7ffff00000000, 0x8003ffffffffffff, 0x0000000003ffffff, 0x001f7fffffffffff,
     0x000000000000000f, 0x00007fffffffffff, 0x000000000000007f, 0x0000c3ff7fffffff,
     0x00203fffffff0000, 0xff80ffffffffffff, 0xe0fffffbfbff003f, 0x000000000000ffff,
     0x0000000007ffffff, 0xffffffffffff07ff, 0x00000000fff800ff, 0x0000000f00000000,
     0x000000007fffffff, 0xffff00f000070000, 0x0fffffffffffffff, 0x1fff07ffffffffff,
     0x0000000093ff01ff, 0x003fffffffffffff, 0xfffffe7fffffffff, 0x00003c5fffffffff,
     0xffffc3fffffff018, 0x000001ffffffffff, 0x0000000000000023, 0x000fffff00000000,
     0x01ffffff007fffff, 0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef,
     0x7bffffffdfdfe7bf, 0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xffffffffffffcfff,
     0x0780000000000000, 0xffdfe00000000000, 0x0000000000000fef, 0x3f801fffffffffff,
     0x000000000000c3ff, 0x83ff0fffffffffff, 0x000000000000ff9f, 0x00000000c3ff080f,
     0xfffe000000000000, 0x001fffffffffffff, 0x3ffffffffffffffe, 0x0af7fe96ffffffef,
     0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff, 0x0003000000000000, 0xffff0fffffffffff,
     0xfffe7fff000fffff, 0x003ffffffffefffe, 0xffffffffffff1fff, 0xffff1fffffffffff,
     0x00001fffffffffff, 0xffffffc000000000, 0x0fffffffffff0007, 0x0000003f000301ff,
     0x07ff1fff003fffff, 0x000fffffffffffff, 0x00000fff01ffffff, 0xffffffffffff0fff,
     0xffffffff03ff00ff, 0x00003fffffff00ff, 0xffffffffffffefff, 0xfc7bffffffffffff,
     0xffffc7e7ffffffff, 0xffffffffffffe7ff, 0x070f3fff000fffff, 0x00000000003f0007,
     0x0000000000000003, 0x0000001400000000, 0x0000000500000000, 0x0000000280000000,
     0x0000050000000000, 0x000000001400140a, 0x2800050000000000, 0x0000000002800000,
     0x0000000000014000, 0x0000000001400000, 0x000000000a000000, 0x0000280000000000,
     0x0000000000200000, 0x0008000000000000, 0x0000000010000000, 0x0000000100000000,
     0x0000000080000000, 0x000000003fffffff}};
static constexpr __range_array __prop_hex_data = {
    0x00000000, 0x00003001, 0x00003A00, 0x00004101, 0x00004700, 0x00006101, 0x00006700,
    0x00FF1001, 0x00FF1A00, 0x00FF2101, 0x00FF2700, 0x00FF4101, 0x00FF4700};
static constexpr __bool_trie<0, 812, 160, 20, 37, 25, 7, 224, 745, 64, 23, 24> __prop_ideo_data{
    {},
    {1,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  2,  0,  3,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 5,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  6,  0, 7,  8,  9,  10, 5,
     11, 0, 0,  0,  0,  0,  0,  12, 13, 0,  0,  0,  0,  0,  0, 14, 15, 14, 16, 0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  17, 0,  0,  0,  0,  0,  0,  0,  18, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  19, 0,  20, 21, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  22, 0,  23, 0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  24, 0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 25, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 26, 0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  22, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  25, 0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  27, 0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 28, 0,  11, 0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  29, 30, 0,  31, 0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  32, 33, 0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,  0,  0,  0,  0,
     0,  0, 0,  0,  34, 34, 34, 34, 34, 35, 34, 36},
    {0x0000000000000000, 0x070003fe000000c0, 0x0000000000000028, 0x000000000000000a,
     0x0000050000000000, 0x0000000000002800, 0x0010000000000000, 0x00000000000003ab,
     0x0000000028000000, 0xa000000000741400, 0x00000140a0000001, 0x0001400000000000,
     0x0000000000000014, 0x00003e8000000050, 0x8000000000000000, 0x000000000000143e,
     0x000000000000001e, 0x000000000a000000, 0x0282800000000000, 0x0500000000000000,
     0xd000000000000000, 0x000000000001f400, 0x5000000000000000, 0x0000000000001400,
     0x0000000000050000, 0x0000000000000050, 0x0000000000500000, 0x0000140000000000,
     0x000a500000000000, 0x0000000280000000, 0x0140000000001450, 0x0050000000000000,
     0x0400001000000000, 0x0000420000101404, 0xffffffffffffffff, 0xffff3fffffffffff,
     0x0000000003ffffff},
    {1, 2, 0, 0, 3, 0, 0, 0, 0, 4, 0, 5, 6, 0, 0, 7, 0, 0, 0, 8, 9, 10, 0, 11, 12},
    {1,  1,  1, 1, 1,  1, 1,  1, 1,  1, 1, 1,  1,  1, 1,  1,  1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1,
     1,  1,  1, 1, 1,  1, 1,  1, 1,  1, 1, 1,  1,  1, 1,  1,  1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1,
     1,  1,  1, 1, 1,  1, 1,  1, 1,  1, 1, 1,  1,  1, 1,  1,  1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1,
     1,  1,  1, 1, 1,  1, 1,  1, 1,  1, 1, 2,  1,  1, 1,  1,  1, 1, 1,  1, 1, 1, 1, 3, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 4, 1, 1, 1, 1, 1, 5,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 6, 7, 0, 8,
     9,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 10, 0, 11, 0, 0,  0, 0, 12, 13, 0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 15, 0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     16, 0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  17, 0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 18,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 19, 0, 0, 0,  20, 0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  22, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 0,  0, 0, 0,  0,  0, 0,  0,  0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
     0,  0,  0, 0, 0,  0, 0,  0, 1,  1, 1, 1,  1,  1, 1,  1,  23},
    {0x0000000000000000, 0xffffffffffffffff, 0x00ffffffffffffff, 0x0007ffffffffffff,
     0xffff000000000000, 0x0fffffffffffffff, 0x0000000000000003, 0x0000001400000000,
     0x0000000500000000, 0x0000000280000000, 0x0000050000000000, 0x000000001400140a,
     0x2800050000000000, 0x0000000002800000, 0x0000000000014000, 0x0000000001400000,
     0x000000000a000000, 0x0000280000000000, 0x0000000000200000, 0x0008000000000000,
     0x0000000010000000, 0x0000000100000000, 0x0000000080000000, 0x000000003fffffff}};
static constexpr __range_array __prop_idsb_data = {0x00000000, 0x002FF001, 0x002FF200, 0x002FF401,
                                                   0x002FFC00};
static constexpr flat_array<2> __prop_idst_data{{0x2FF2, 0x2FF3}};
static constexpr flat_array<2> __prop_join_c_data{{0x200C, 0x200D}};
static constexpr __range_array __prop_loe_data = {
    0x00000000, 0x000E4001, 0x000E4500, 0x000EC001, 0x000EC500, 0x0019B501, 0x0019B800, 0x0019BA01,
    0x0019BB00, 0x00AAB501, 0x00AAB700, 0x00AAB901, 0x00AABA00, 0x00AABB01, 0x00AABD00};
static constexpr __bool_trie<32, 991, 1, 0, 55, 255, 1, 0, 378, 13, 57, 42> __prop_oalpha_data{
    {0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000020, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0xbfff000000000000, 0x00000000000000b6,
     0x0000000007ff0000, 0x00010000fefff800, 0x0000000000000000, 0x0000219e1fc00000,
     0xffff000000020000, 0x0000000000000000, 0x0001ffc000000000, 0x0000000000000000},
    {1,  1,  2,  3,  4,  5,  6,  5,  7,  5,  8, 5,  9,  10, 11, 12, 13, 5,  13, 12, 14, 15, 16, 17,
     18, 19, 18, 1,  20, 21, 1,  22, 23, 24, 1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 25, 25, 26, 27, 1,  1,  28, 1,  29, 1,  1,  1,  30,
     31, 1,  1,  32, 33, 34, 35, 36, 1,  1,  1, 1,  1,  1,  37, 1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  26, 38, 1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  39, 1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  40, 41, 1, 1,  1,  1,  1,  42, 1,  43, 44, 45, 46, 47, 48, 49,
     50, 51, 52, 1,  1,  1,  53, 1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 54, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  1,  1,  1},
    {0x00001eeff8c00000, 0x0000000000000000, 0xffff03f8fff00000, 0xcc0000000000000f,
     0x0000000c00e0dfff, 0xc00000000000000e, 0x0000000c0080199f, 0x0023000000021987,
     0x1c00000c00001bbf, 0x0000000c00c0199f, 0xc000000000000004, 0x0000000000801dc7,
     0xc00000000000000f, 0x0000000c00601ddf, 0x0000000c00801ddf, 0x000000000000000c,
     0x000c0000ff5f8000, 0x07f2000000000000, 0x0000000000002000, 0x1bf2000000000000,
     0xfffe000000000000, 0x1ffffffffeffe003, 0x797ff80000000000, 0x001e3f9dc3c00000,
     0x000000003c00bffc, 0x000c0000000c0000, 0xffc0000000000000, 0x00000000000001ff,
     0x0000020000000060, 0x01ff0fff00000000, 0x000000000f800000, 0x001ffffe7fe00000,
     0xffe000000000001f, 0x000000000000000f, 0x000033fe00000007, 0x0003ff8000000000,
     0x007ffff000000000, 0x001fff8000000000, 0x000003ffffffffff, 0xffffffff00000000,
     0x0ff0000000000000, 0x00000000c0000000, 0x000000f800000804, 0xfff0000000000003,
     0x800000000000002f, 0x000007c000000000, 0x000000000007ff80, 0xfff000000000000f,
     0x0000002000000000, 0x007ffe0000000000, 0x3800000000003008, 0x419d000000000000,
     0x0020f80000000000, 0x000007f800000000, 0x0000000040000000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 4, 2, 2, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  2,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  3,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  4,  5,  6,  0, 7,  8,  9,  0, 10, 0, 0, 11, 12, 13, 0, 0,  14, 15, 16, 17, 0,
     0,  18, 19, 20, 21, 22, 0, 23, 0,  0,  0, 24, 0, 0, 0,  0,  0,  0, 25, 26, 27, 28, 0,  0,
     0,  0,  0,  29, 0,  30, 0, 31, 32, 33, 0, 0,  0, 0, 34, 0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     35, 36, 0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  37, 0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  38, 0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  39, 0,  0, 0,  0, 0, 0,  0,  0,  0, 0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0, 0,  0, 0, 0,  16, 40, 41},
    {0x0000000000000000, 0x07c0000000000000, 0x000000000000f06e, 0x000000f000000000,
     0xff00000000000007, 0x000000000000003f, 0x01ff000000000004, 0x0007ff8000000007,
     0x0000000000000060, 0xfff8000000000007, 0x409ff00000000000, 0x000001ff80000000,
     0xc00000000000000f, 0x0000000c0080199f, 0xffe0000000000000, 0x000000000000003b,
     0xffff000000000000, 0x0000000000000003, 0x7f3f800000000000, 0x0000000030000000,
     0x7fff000000000000, 0x0000000000000001, 0x003ff80000000000, 0x000007ffe0000000,
     0x01fff00000000000, 0x00000010fcfe0000, 0x7be00000000007fe, 0x000000000ffe0000,
     0x0000000000fffc00, 0x7f7f800000000000, 0x007ffefffffc0000, 0xb47e000000000000,
     0x000000000000008b, 0x00000000007b7c00, 0x0078000000000000, 0xfffffffffffe8000,
     0x00000000000780ff, 0x0000000040000000, 0x000007dbf9ffff7f, 0x0000000000000080,
     0xffff03ffffff03ff, 0x00000000000003ff}};
static constexpr flat_array<7> __prop_odi_data{
    {0x034F, 0x115F, 0x1160, 0x17B4, 0x17B5, 0x3164, 0xFFA0}};
static constexpr __range_array __prop_ogr_ext_data = {
    0x00000000, 0x0009BE01, 0x0009BF00, 0x0009D701, 0x0009D800, 0x000B3E01, 0x000B3F00,
    0x000B5701, 0x000B5800, 0x000BBE01, 0x000BBF00, 0x000BD701, 0x000BD800, 0x000CC201,
    0x000CC300, 0x000CD501, 0x000CD700, 0x000D3E01, 0x000D3F00, 0x000D5701, 0x000D5800,
    0x000DCF01, 0x000DD000, 0x000DDF01, 0x000DE000, 0x001B3501, 0x001B3600, 0x00200C01,
    0x00200D00, 0x00302E01, 0x00303000, 0x00FF9E01, 0x00FFA000, 0x01133E01, 0x01133F00,
    0x01135701, 0x01135800, 0x0114B001, 0x0114B100, 0x0114BD01, 0x0114BE00, 0x0115AF01,
    0x0115B000, 0x01D16501, 0x01D16600, 0x01D16E01, 0x01D17300, 0x0E002001, 0x0E008000};
static constexpr __range_array __prop_oidc_data = {0x00000000, 0x0000B701, 0x0000B800,
                                                   0x00038701, 0x00038800, 0x00136901,
                                                   0x00137200, 0x0019DA01, 0x0019DB00};
static constexpr flat_array<6> __prop_oids_data{{0x1885, 0x1886, 0x2118, 0x212E, 0x309B, 0x309C}};
static constexpr __range_array __prop_olower_data = {
    0x00000000, 0x0000AA01, 0x0000AB00, 0x0000BA01, 0x0000BB00, 0x0002B001, 0x0002B900,
    0x0002C001, 0x0002C200, 0x0002E001, 0x0002E500, 0x00034501, 0x00034600, 0x00037A01,
    0x00037B00, 0x001D2C01, 0x001D6B00, 0x001D7801, 0x001D7900, 0x001D9B01, 0x001DC000,
    0x00207101, 0x00207200, 0x00207F01, 0x00208000, 0x00209001, 0x00209D00, 0x00217001,
    0x00218000, 0x0024D001, 0x0024EA00, 0x002C7C01, 0x002C7E00, 0x00A69C01, 0x00A69E00,
    0x00A77001, 0x00A77100, 0x00A7F801, 0x00A7FA00, 0x00AB5C01, 0x00AB6000};
static constexpr __bool_trie<32, 893, 96, 3, 21, 2, 13, 241, 107, 80, 5, 16> __prop_omath_data{
    {0x0000000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0033000000270000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1, 2, 3, 4,  5, 6, 7, 8, 0, 0, 0,  0,  9, 0, 10, 11, 0, 0, 0, 0, 0, 0,  12, 13, 14, 15, 0, 0,
     0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 17, 18, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,
     0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 19, 0,  0,  20},
    {0x0000000000000000, 0x001c000000400000, 0x6000001e00000001, 0x0000000000006000,
     0x0000f8621fff0000, 0xf1fbb3103e2ffc84, 0x00000000000003e0, 0xf0c33eb6f3e00000,
     0x000000302feb3fff, 0x0000000000000f00, 0x00b0000000000000, 0x0000000400010000,
     0xf07fc00300000000, 0x00001f94000f8cc1, 0x0000000000000060, 0x0000600f00000005,
     0x0000ffc000000060, 0x0000000001fffff8, 0x300000000f000000, 0x0000010a00000000,
     0x5000000000000000},
    {1, 2},
    {1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 13, 14, 15},
    {0x0000000000000000, 0xffffffffffffffff, 0xffffffffffdfffff, 0xebffde64dfffffff,
     0xffffffffffffffef, 0x7bffffffdfdfe7bf, 0xfffffffffffdfc5f, 0xffffff3fffffffff,
     0xf7fffffff7fffffd, 0xffdfffffffdfffff, 0xffff7fffffff7fff, 0xfffffdfffffffdff,
     0xffffffffffffcff7, 0x0af7fe96ffffffef, 0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff}};
static constexpr __range_array __prop_oupper_data = {0x00000000, 0x00216001, 0x00217000, 0x0024B601,
                                                     0x0024D000, 0x01F13001, 0x01F14A00, 0x01F15001,
                                                     0x01F16A00, 0x01F17001, 0x01F18A00};
static constexpr __bool_trie<32, 890, 96, 6, 15, 0, 0, 0, 0, 0, 0, 0> __prop_pat_syn_data{
    {0xfc00fffe00000000, 0x7800000178000001, 0x88435afe00000000, 0x0080000000800000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000},
    {1, 2, 0, 0, 0,  0, 3, 4, 4, 4, 4, 4, 4, 4, 4,  4, 5,  6, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4,  4, 7,
     8, 4, 4, 4, 4,  4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  9, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0,
     0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,
     0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0,  0, 0, 14},
    {0x0000000000000000, 0x7fff00ffffff0000, 0x000000007feffffe, 0xffffffffffff0000,
     0xffffffffffffffff, 0x0000007fffffffff, 0x00000000000007ff, 0x003fffffffffffff,
     0xfffffffffff00000, 0xffcfffffffffffff, 0xffffffffff3fffff, 0x000000000000ffff,
     0x00010001ffffff0e, 0xc000000000000000, 0x0000000000000060},
    {},
    {},
    {}};
static constexpr flat_array<11> __prop_pat_ws_data{
    {0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x0020, 0x0085, 0x200E, 0x200F, 0x2028, 0x2029}};
static constexpr flat_array<11> __prop_pcm_data{
    {0x0600, 0x0601, 0x0602, 0x0603, 0x0604, 0x0605, 0x06DD, 0x070F, 0x08E2, 0x110BD, 0x110CD}};
static constexpr __range_array __prop_qmark_data = {
    0x00000000, 0x00002201, 0x00002300, 0x00002701, 0x00002800, 0x0000AB01, 0x0000AC00,
    0x0000BB01, 0x0000BC00, 0x00201801, 0x00202000, 0x00203901, 0x00203B00, 0x002E4201,
    0x002E4300, 0x00300C01, 0x00301000, 0x00301D01, 0x00302000, 0x00FE4101, 0x00FE4500,
    0x00FF0201, 0x00FF0300, 0x00FF0701, 0x00FF0800, 0x00FF6201, 0x00FF6400};
static constexpr __range_array __prop_radical_data = {
    0x00000000, 0x002E8001, 0x002E9A00, 0x002E9B01, 0x002EF400, 0x002F0001, 0x002FD600};
static constexpr __range_array __prop_ri_data = {0x00000000, 0x01F1E601, 0x01F20000};
static constexpr flat_array<46> __prop_sd_data{
    {0x0069,  0x006A,  0x012F,  0x0249,  0x0268,  0x029D,  0x02B2,  0x03F3,  0x0456,  0x0458,
     0x1D62,  0x1D96,  0x1DA4,  0x1DA8,  0x1E2D,  0x1ECB,  0x2071,  0x2148,  0x2149,  0x2C7C,
     0x1D422, 0x1D423, 0x1D456, 0x1D457, 0x1D48A, 0x1D48B, 0x1D4BE, 0x1D4BF, 0x1D4F2, 0x1D4F3,
     0x1D526, 0x1D527, 0x1D55A, 0x1D55B, 0x1D58E, 0x1D58F, 0x1D5C2, 0x1D5C3, 0x1D5F6, 0x1D5F7,
     0x1D62A, 0x1D62B, 0x1D65E, 0x1D65F, 0x1D692, 0x1D693}};
static constexpr __bool_trie<32, 991, 1, 0, 29, 255, 1, 0, 322, 41, 21, 23> __prop_sterm_data{
    {0x8000400200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000000,
     0x00000000c0000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000,
     0x0000000000000007, 0x0000000000000000, 0x0000000000000000, 0x0200000000000000},
    {1,  1,  1,  1,  2,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 3, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  4,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  5,  1, 1, 6,  1, 1, 1,  7, 1, 1, 1, 1, 8,  1,  1,  1,  1, 9,  1,  1, 10, 1,
     1,  11, 12, 1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  13, 14, 1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 15, 1,  1, 1,  1,
     1,  1,  1,  16, 1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  17, 1,  1,  1, 1, 18, 1, 1, 19, 1, 1, 1, 1, 1, 20, 1,  18, 21, 1, 1,  22, 1, 23, 1,
     24, 1,  1,  1,  25, 1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  1,  1, 1,  1,
     1,  1,  1,  1,  1,  1, 1, 1,  1, 1, 1,  1, 1, 1, 1, 1, 1,  1,  1,  1,  1, 1,  26, 1, 1,  27,
     28, 1,  1},
    {0x6280000000000000, 0x0000000000000000, 0x0000003000000000, 0x0000000000000c00,
     0x0000018400000000, 0x0000400000000000, 0x0060000000000000, 0x0000000000000208,
     0x0000000000000030, 0x00000f0000000000, 0x00000000cc000000, 0x1800000000000000,
     0xc000000000000000, 0x3000000000000000, 0x0000000000000380, 0x1000400000000000,
     0x0000000000000004, 0x8000000000000000, 0x000000000000c000, 0x0088000000000000,
     0x00c0000000000000, 0x0000800000000000, 0x0000000000000300, 0x00000000e0000000,
     0x0003000000000000, 0x0000080000000000, 0x0000000000c40000, 0x0000000080004002,
     0x0000000200000000},
    {1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 4, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    {1, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  2,  0,  0,  0, 3,  4, 5,
     0, 6,  0, 7,  8, 0,  9,  0,  0, 0, 0,  0,  0, 10, 0, 0, 0, 0, 0,  11, 0,  12, 0,  0, 13, 0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 14, 15, 0, 0,  0, 0, 0, 0, 12, 0,  0,  0,  0,  0, 0,  0, 0,
     0, 16, 0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,
     0, 0,  0, 17, 0, 18, 16, 19, 0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  20, 0,  0,  0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  21, 0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 0,  0, 0,
     0, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0,  0,  0, 22},
    {0x0000000000000000, 0x0000000000c00000, 0x0000000003e00000, 0x0000000000000180,
     0xc000000000000000, 0x0000000000000003, 0x000000000000000e, 0x00000000c0002060,
     0x1b00000000000000, 0x0000020000000000, 0x0000000000001800, 0x0000000000fffe0c,
     0x0000000000000006, 0x7000000000000000, 0x000000000000000c, 0x0000000018000000,
     0x0180000000000000, 0x0000c00000000000, 0x0020000000000000, 0x0000000000000010,
     0x0000000001000000, 0x0000000080000000, 0x0000000000000100}};
static constexpr __bool_trie<32, 991, 1, 0, 34, 255, 1, 0, 413, 14, 21, 31> __prop_term_data{
    {0x8c00500200000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x4000000000000000, 0x0000000000000080, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
     0x0000000000000000, 0x0000000000000000, 0x0000000000000200, 0x0000000000000008,
     0x00000000c8001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000100000,
     0x00000000000017ff, 0x0000000000000000, 0x0000000000000000, 0x0300000000000000},
    {1,  2,  2,  2,  3,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 4,  2,
     2,  5,  2,  2,  2,  2, 6, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  7,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  8,  2, 9, 10, 2, 2, 11, 12, 2, 2, 2, 2, 13, 2,  2,  2,  2, 14, 2,  2, 15, 2,
     2,  16, 17, 2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  18, 19, 2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 20, 21, 2, 2,  2,
     2,  2,  2,  22, 2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  17, 2,  2,  2, 2, 23, 2, 2, 24, 2,  2, 2, 2, 2, 25, 2,  26, 27, 2, 2,  19, 2, 28, 2,
     29, 2,  2,  2,  30, 2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  2,  2, 2,  2,
     2,  2,  2,  2,  2,  2, 2, 2,  2, 2, 2,  2,  2, 2, 2, 2, 2,  2,  2,  2,  2, 2,  31, 2, 2,  32,
     33, 2,  2},
    {0x7fff000000000000, 0x0000000040000000, 0x0000000000000000, 0x0000003000000000,
     0x000000000c000000, 0x000000000007e100, 0x0000000000000c00, 0x000001fe00000000,
     0x0000400000000000, 0x0000380000000000, 0x0060000000000000, 0x0000000004700000,
     0x000000000000033c, 0x0000000000000030, 0x00000f0000000000, 0x00000000ec000000,
     0xf800000000000000, 0xc000000000000000, 0x3000000000000000, 0x0000000000000380,
     0x1000400000000000, 0x000000000000d002, 0x0000000000000006, 0x000000000000e000,
     0x00f8000000000000, 0x00c0000000000000, 0x000000000000c000, 0x0000800000000000,
     0x00000000e0000000, 0x0003000080000000, 0x0000080000000000, 0x0000000000f70000,
     0x000000008c005002, 0x0000001200000000},
    {1, 2, 3, 3, 3, 4, 3, 3, 3, 3, 5, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
    {1,  2,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 3, 0, 0,  1, 0,  0, 0,
     0,  4,  0, 5,  6, 0,  7,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 8,  0, 0,  0, 9,
     10, 11, 0, 12, 0, 13, 14, 0, 15, 0, 0, 0, 0, 0,  0,  16, 0, 0, 0, 0, 0, 17, 0, 18, 0, 0,
     19, 0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 20, 21, 0,  0, 0, 0, 0, 0, 22, 0, 0,  0, 0,
     0,  0,  0, 0,  0, 23, 0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  24, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 25, 0, 26,
     27, 28, 0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  29, 0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 1, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  0, 0,  0, 0,
     0,  0,  0, 0,  0, 0,  0,  0, 0,  0, 0, 0, 0, 0,  0,  0,  0, 0, 0, 0, 0, 0,  30},
    {0x0000000000000000, 0x0000000080000000, 0x0000000000010000, 0x0000000000800000,
     0x0000000000c00000, 0x003f000000000000, 0xfc00000000000000, 0x000000001e000000,
     0x0000000003e00000, 0x0000000000003f80, 0xc000000000000000, 0x0000000000000003,
     0x000000000000000e, 0x00000000c0002060, 0x1f00000000000000, 0x0000020000000000,
     0x0000000008003800, 0x0000000000fffe3c, 0x0000000000000006, 0x7000000000000000,
     0x000000000000000c, 0x0000000618000000, 0x000200000000000e, 0x0180000000000000,
     0x001f000000000000, 0x0000c00000000000, 0x0020000000000000, 0x0380000000000000,
     0x0000000000000010, 0x0000000001800000, 0x0000000000000780}};
static constexpr __bool_trie<0, 793, 176, 23, 34, 15, 16, 225, 496, 64, 16, 18> __prop_uideo_data{
    {},
    {1, 0, 2,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  3,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  4,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  5, 0,
     6, 7, 8,  9,  4, 10, 0, 0,  0,  0,  0, 0, 11, 12, 0,  0,  0,  0,  0,  0, 13, 14, 13, 15, 0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  16, 0, 0, 0,  0,  0,  0,  0,  17, 0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  18, 0,  19, 20, 0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 21, 0, 22, 0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 23,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 24, 0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 25, 0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 21, 0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 24, 0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  26, 0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  27, 0,  10, 0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 28, 29, 0, 30, 0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  31, 32, 0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0,  0, 0,  0,  0,  0,  0, 0,
     0, 0, 0,  0,  0, 0,  0, 0,  0,  0,  0, 0, 33},
    {0x0000000000000000, 0x0000000000000028, 0x000000000000000a, 0x0000050000000000,
     0x0000000000002800, 0x0010000000000000, 0x00000000000003ab, 0x0000000028000000,
     0xa000000000741400, 0x00000140a0000001, 0x0001400000000000, 0x0000000000000014,
     0x00003e8000000050, 0x8000000000000000, 0x000000000000143e, 0x000000000000001e,
     0x000000000a000000, 0x0282800000000000, 0x0500000000000000, 0xd000000000000000,
     0x000000000001f400, 0x5000000000000000, 0x0000000000001400, 0x0000000000050000,
     0x0000000000000050, 0x0000000000500000, 0x0000140000000000, 0x000a500000000000,
     0x0000000280000000, 0x0140000000001450, 0x0050000000000000, 0x0400001000000000,
     0x0000420000101404, 0x0000039a801ac000},
    {1, 0, 2, 3, 0, 0, 4, 0, 0, 0, 5, 6, 7, 0, 8},
    {1, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0,  7,  8, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 9,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  11, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 12, 0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  13, 0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 14, 0, 0, 0,  15, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  16, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 17},
    {0x0000000000000000, 0x0000000000000003, 0x0000001400000000, 0x0000000500000000,
     0x0000000280000000, 0x0000050000000000, 0x000000001400140a, 0x2800050000000000,
     0x0000000002800000, 0x0000000000014000, 0x0000000001400000, 0x000000000a000000,
     0x0000280000000000, 0x0000000000200000, 0x0008000000000000, 0x0000000010000000,
     0x0000000100000000, 0x0000000080000000}};
static constexpr __range_array __prop_vs_data = {0x00000000, 0x00180B01, 0x00180E00, 0x00FE0001,
                                                 0x00FE1000, 0x0E010001, 0x0E01F000};
static constexpr __range_array __prop_wspace_data = {
    0x00000000, 0x00000901, 0x00000E00, 0x00002001, 0x00002100, 0x00008501, 0x00008600,
    0x0000A001, 0x0000A100, 0x00168001, 0x00168100, 0x00200001, 0x00200B00, 0x00202801,
    0x00202A00, 0x00202F01, 0x00203000, 0x00205F01, 0x00206000, 0x00300001, 0x00300100};
static constexpr __bool_trie<32, 991, 1, 0, 160, 255, 1, 0, 1407, 1, 0, 130> __prop_xidc_data{
    {0x03ff000000000000, 0x07fffffe87fffffe, 0x04a0040000000000, 0xff7fffffff7fffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x0000501f0003ffc3,
     0xffffffffffffffff, 0xb8dfffffffffffff, 0xfffffffbffffd7c0, 0xffbfffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xfffffffffffffcfb, 0xffffffffffffffff,
     0xfffeffffffffffff, 0xffffffff027fffff, 0xbffffffffffe01ff, 0x000787ffffff00b6,
     0xffffffff07ff0000, 0xffffc3ffffffffff, 0xffffffffffffffff, 0x9ffffdff9fefffff,
     0xffffffffffff0000, 0xffffffffffffe7ff, 0x0003ffffffffffff, 0x243fffffffffffff},
    {1,   2,   3,   4,   5,   6,   7,   8,   9,   10, 11,  12,  13,  14,  15,  16,  17,  18,  19,
     20,  21,  22,  23,  24,  25,  26,  27,  28,  29, 30,  31,  4,   32,  33,  34,  4,   4,   4,
     4,   4,   35,  36,  37,  38,  39,  40,  41,  42, 4,   4,   4,   4,   4,   4,   4,   4,   43,
     44,  45,  46,  47,  4,   48,  49,  50,  51,  52, 53,  54,  55,  56,  57,  58,  59,  60,  4,
     61,  4,   62,  63,  64,  65,  66,  4,   4,   4,  67,  4,   4,   4,   4,   68,  69,  70,  71,
     72,  73,  74,  75,  76,  77,  78,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 79,  80,  4,   81,  82,  83,  84,  85,  60,
     60,  60,  60,  60,  60,  60,  60,  86,  42,  87, 88,  89,  4,   90,  91,  60,  60,  60,  60,
     60,  60,  60,  60,  92,  60,  93,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  94,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  95,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  96,  60,  97,  98,  99,  100, 95,  101,
     60,  60,  60,  60,  60,  60,  102, 103, 60,  60, 60,  60,  60,  60,  72,  104, 72,  105, 60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 106, 60,  60,  60,  60,  60,  60,  60,  107,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  108, 60,  109, 110, 60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  111, 60,  112, 60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  113, 60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  114, 60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  115, 60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  111, 60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  114, 60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  116, 60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  117, 60,  101,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  118, 119, 60,
     120, 60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  121, 122, 4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   123, 124,
     4,   4,   4,   4,   125, 126, 4,   127, 128, 4,  129, 130, 131, 62,  4,   132, 133, 134, 4,
     135, 136, 137, 4,   138, 139, 140, 4,   141, 4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,
     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   142, 143, 60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  60,  60,  60,  60,  60,  60,
     60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 60,  60,  60,  4,   4,   4,   4,   4,   133,
     4,   144, 145, 146, 127, 147, 4,   148, 4,   4,  149, 150, 151, 152, 153, 154, 4,   155, 156,
     157, 158, 159},
    {0x00003fffffffffff, 0x000007ff0fffffff, 0x3fdfffff00000000, 0xfffffffbfff80000,
     0xffffffffffffffff, 0xfffeffcfffffffff, 0xf3c5fdfffff99fef, 0x5003ffcfb080799f,
     0xd36dfdfffff987ee, 0x003fffc05e023987, 0xf3edfdfffffbbfee, 0xfe00ffcf00013bbf,
     0xf3edfdfffff99fee, 0x0002ffcfb0c0399f, 0xc3ffc718d63dc7ec, 0x0000ffc000813dc7,
     0xe3fffdfffffddfff, 0x0000ffcf07603ddf, 0xf3effdfffffddfef, 0x0006ffcf40603ddf,
     0xfffffffffffddfef, 0xfc00ffcf80f07ddf, 0x2ffbfffffc7fffec, 0x000cffc0ff5f847f,
     0x07fffffffffffffe, 0x0000000003ff7fff, 0x3fffffaffffff7d6, 0x00000000f3ff3f5f,
     0xc2a003ff03000001, 0xfffe1ffffffffeff, 0x1ffffffffeffffdf, 0x0000000000000040,
     0xffffffffffff03ff, 0xffffffff3fffffff, 0xf7ffffffffff20bf, 0xffffffff3d7f3dff,
     0x7f3dffffffff3dff, 0xffffffffff7fff3d, 0xffffffffff3dffff, 0x0003fe00e7ffffff,
     0xffffffff0000ffff, 0x3f3fffffffffffff, 0xfffffffffffffffe, 0xffff9fffffffffff,
     0xffffffff07fffffe, 0x01ffc7ffffffffff, 0x001fffff001fdfff, 0x000ddfff000fffff,
     0x000003ff308fffff, 0xffffffff03ff3800, 0x01ffffffffffffff, 0xffff07ffffffffff,
     0x003fffffffffffff, 0x0fff0fff7fffffff, 0x001f3fffffffffc0, 0xffff0fffffffffff,
     0x0000000007ff03ff, 0xffffffff0fffffff, 0x9fffffff7fffffff, 0x3fff008003ff03ff,
     0x0000000000000000, 0x000ff80003ff0fff, 0x000fffffffffffff, 0x00ffffffffffffff,
     0x3fffffffffffe3ff, 0xe7ffffffffff01ff, 0x07fffffffff70000, 0xfbffffffffffffff,
     0xffffffff3f3fffff, 0x3fffffffaaff3f3f, 0x5fdfffffffffffff, 0x1fdc1fff0fcf1fdc,
     0x8000000000000000, 0x8002000000100001, 0x000000001fff0000, 0x0001ffe21fff0000,
     0xf3fffd503f2ffc84, 0xffffffff000043e0, 0x00000000000001ff, 0xffff7fffffffffff,
     0xffffffff7fffffff, 0x000ff81fffffffff, 0xffff20bfffffffff, 0x800080ffffffffff,
     0x7f7f7f7f007fffff, 0xffffffff7f7f7f7f, 0x1f3efffe000000e0, 0xfffffffee67fffff,
     0xf7ffffffffffffff, 0xfffeffffffffffe0, 0x07ffffff00007fff, 0xffff000000000000,
     0x0000000000000028, 0x000000000000000a, 0x0000050000000000, 0x0000000000002800,
     0x0010000000000000, 0x00000000000003ab, 0x0000000028000000, 0xa000000000741400,
     0x00000140a0000001, 0x0001400000000000, 0x0000000000000014, 0x00003e8000000050,
     0x000000000000143e, 0x000000000000001e, 0x000000000a000000, 0x0282800000000000,
     0x0500000000000000, 0xd000000000000000, 0x000000000001f400, 0x5000000000000000,
     0x0000000000001400, 0x0000000000050000, 0x0000000000000050, 0x0000000000500000,
     0x0000140000000000, 0x000a500000000000, 0x0000000280000000, 0x0140000000001450,
     0x0050000000000000, 0x0400001000000000, 0x0000420000101404, 0x0000000000001fff,
     0x3fffffffffff0000, 0x00000fffffff1fff, 0xbff0ffffffffffff, 0x0003ffffffffffff,
     0xfffffffcff800000, 0xfffffffffffff9ff, 0xff8000000000007c, 0x000000ffffffffff,
     0xe8ffffff03ff003f, 0xffff3fffffffffff, 0x1fffffff000fffff, 0x7fffffff03ff8001,
     0x007fffffffffffff, 0xfc7fffff03ff3fff, 0x007cffff38000007, 0xffff7f7f007e7e7e,
     0xffff00fff7ffffff, 0x03ff37ffffffffff, 0xffff000fffffffff, 0x0ffffffffffff87f,
     0x0000000003ffffff, 0x5f7ffdffe0f8007f, 0xffffffffffffffdb, 0xfffffffffff80000,
     0xfffffff03fffffff, 0x3fffffffffffffff, 0xffffffffffff0000, 0xfffffffffffcffff,
     0x03ff0000000000ff, 0x0018ffff0000ffff, 0xaa8a00000000e000, 0x1fffffffffffffff,
     0x87fffffe03ff0000, 0xffffffc007fffffe, 0x7fffffffffffffff, 0x000000001cfcfcfc},
    {1,  2,  3, 4,  5,  6, 7, 8, 5, 5, 9, 5, 10, 11, 5, 12, 5, 13, 14, 5, 5, 15, 5, 5, 5, 16,
     17, 18, 5, 19, 20, 5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 21,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5},
    {1,   2,   3,   4,   5,  4,   6,  4,   4,   7,   8,   9,   10, 11, 12,  2,   2,  13, 14,  15,
     16,  4,   4,   2,   2,  2,   2,  17,  18,  4,   4,   19,  20, 21, 22,  23,  4,  24, 4,   25,
     26,  27,  28,  29,  30, 31,  4,  2,   32,  33,  33,  34,  4,  4,  4,   4,   4,  4,  4,   35,
     36,  4,   37,  2,   38, 3,   39, 40,  41,  2,   42,  43,  4,  44, 45,  46,  47, 4,  4,   2,
     48,  2,   49,  4,   4,  50,  51, 2,   52,  53,  54,  55,  4,  4,  4,   3,   4,  56, 57,  4,
     4,   58,  59,  60,  61, 62,  53, 4,   4,   4,   4,   63,  64, 65, 4,   66,  67, 68, 4,   4,
     4,   4,   37,  4,   4,  4,   4,  2,   2,   2,   2,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   69,  4,   2,   70, 2,   2,  2,   71,  4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   2,   2,   2,   2,  2,   2,  70,  4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     72,  4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   2,   2,  2,  2,   2,
     2,   2,   2,   53,  73, 4,   74, 17,  75,  76,  4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     2,   4,   4,   2,   77, 78,  79, 2,   2,   2,   2,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,   2,   2,  2,  2,   2,
     2,   2,   80,  2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  33,  4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   2,   2,  2,  2,   21,
     81,  2,   2,   2,   2,  2,   82, 4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   2,   83, 84,  4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   85, 86,  4,  4,   87,  4,   4,   4,   4,  4,  4,   2,   88, 89, 90,  91,
     92,  2,   2,   2,   2,  93,  94, 95,  96,  97,  98,  4,   4,  4,  4,   4,   4,  4,  4,   99,
     100, 101, 4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   102, 4,  4,   4,  103, 104, 4,   4,   4,   4,  4,  105, 4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   2,   2,  2,  106, 2,
     107, 4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   108,
     109, 110, 4,   4,   4,  4,   4,  111, 112, 4,   113, 114, 4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   115, 4,  116, 4,  4,   4,   4,   117, 118, 4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  119, 4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   120, 4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   121,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   122, 4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   123, 4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   124, 4,  4,  4,   125,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   126, 4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   127, 4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,   2,   2,  2,  2,   128,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  2,   2,   2,   129, 4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,   4,  4,   4},
    {0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff,
     0x0000000000000000, 0x001fffffffffffff, 0x2000000000000000, 0xffffffff1fffffff,
     0x000000010001ffff, 0xffffe000ffffffff, 0x07ffffffffff07ff, 0xffffffff3fffffff,
     0x00000000003eff0f, 0xffff03ff3fffffff, 0x0fffffffff0fffff, 0xffff00ffffffffff,
     0x0000000fffffffff, 0x007fffffffffffff, 0x000000ff003fffff, 0x91bffffffffffd3f,
     0x007fffff003fffff, 0x000000007fffffff, 0x0037ffff00000000, 0x03ffffff003fffff,
     0xc0ffffffffffffff, 0x873ffffffeeff06f, 0x1fffffff00000000, 0x000000001fffffff,
     0x0000007ffffffeff, 0x003fffffffffffff, 0x0007ffff003fffff, 0x000000000003ffff,
     0x00000000000001ff, 0x0007ffffffffffff, 0x03ff00ffffffffff, 0xffff00801fffffff,
     0x000000000001ffff, 0x007fffff00000000, 0x8000ffc00000007f, 0x03ff01ffffff0000,
     0xffdfffffffffffff, 0x004fffffffff0070, 0x0000000017ff1e1f, 0x40fffffffffbffff,
     0xffff01ffbfffbd7f, 0x03ff07ffffffffff, 0xfbedfdfffff99fef, 0x001f1fcfe081399f,
     0x00000000c3ff07ff, 0x0000000003ff00bf, 0xff3fffffffffffff, 0x000000003f000001,
     0x0000000003ff0011, 0x01ffffffffffffff, 0x00000000000003ff, 0x03ff0fffe7ffffff,
     0xffffffff00000000, 0x800003ffffffffff, 0xfffffcff00000000, 0x0000001bfcffffff,
     0x7fffffffffffffff, 0xffffffffffff0080, 0x0000000023ffffff, 0xff7ffffffffffdff,
     0xfffc000003ff0001, 0x007ffefffffcffff, 0xb47ffffffffffb7f, 0xfffffdbf03ff00ff,
     0x000003ff01fb7fff, 0x0000000003ffffff, 0x00007fffffffffff, 0x000000000000000f,
     0x000000000000007f, 0x000003ff7fffffff, 0x001f3fffffff0000, 0xe0fffff803ff000f,
     0x000000000000ffff, 0xffffffffffff87ff, 0x00000000ffff80ff, 0x0000000b00000000,
     0x00ffffffffffffff, 0xffff00f000070000, 0x0fffffffffffffff, 0x1fff07ffffffffff,
     0x0000000063ff01ff, 0xf807e3e000000000, 0x00003c0000000fe7, 0x000000000000001c,
     0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef, 0x7bffffffdfdfe7bf,
     0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xf7fffffff7fffffd, 0xffdfffffffdfffff,
     0xffff7fffffff7fff, 0xfffffdfffffffdff, 0xffffffffffffcff7, 0xf87fffffffffffff,
     0x00201fffffffffff, 0x0000fffef8000010, 0x000007dbf9ffff7f, 0x3fff1fffffffffff,
     0x00000000000043ff, 0x03ffffffffffffff, 0x00000000007f001f, 0x0000000003ff0fff,
     0x0af7fe96ffffffef, 0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff, 0x0000000000000003,
     0x0000001400000000, 0x0000000500000000, 0x0000000280000000, 0x0000050000000000,
     0x000000001400140a, 0x2800050000000000, 0x0000000002800000, 0x0000000000014000,
     0x0000000001400000, 0x000000000a000000, 0x0000280000000000, 0x0000000000200000,
     0x0008000000000000, 0x0000000010000000, 0x0000000100000000, 0x0000000080000000,
     0x000000003fffffff, 0x0000ffffffffffff}};
static constexpr __bool_trie<32, 991, 1, 0, 165, 255, 1, 0, 1343, 1, 0, 120> __prop_xids_data{
    {0x0000000000000000, 0x07fffffe07fffffe, 0x0420040000000000, 0xff7fffffff7fffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x0000501f0003ffc3,
     0x0000000000000000, 0xb8df000000000000, 0xfffffffbffffd740, 0xffbfffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xfffffffffffffc03, 0xffffffffffffffff,
     0xfffeffffffffffff, 0xffffffff027fffff, 0x00000000000001ff, 0x000787ffffff0000,
     0xffffffff00000000, 0xfffec000000007ff, 0xffffffffffffffff, 0x9c00c060002fffff,
     0x0000fffffffd0000, 0xffffffffffffe000, 0x0002003fffffffff, 0x043007fffffffc00},
    {1,   2,   3,   4,   5,   6,   7,   8,   9,   10, 11,  12,  13,  14,  15,  16,  17,  18,  19,
     20,  21,  22,  23,  24,  23,  25,  26,  27,  28, 29,  3,   30,  31,  32,  33,  34,  34,  34,
     34,  34,  35,  36,  37,  38,  39,  40,  41,  42, 34,  34,  34,  34,  34,  34,  34,  34,  43,
     44,  45,  46,  47,  48,  49,  50,  51,  52,  53, 54,  55,  56,  57,  58,  59,  60,  3,   61,
     62,  63,  64,  65,  66,  67,  68,  34,  34,  34, 3,   34,  34,  34,  34,  69,  70,  71,  72,
     3,   73,  74,  3,   75,  76,  77,  3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  78,  79,  34,  80,  81,  82,  83,  84,  3,
     3,   3,   3,   3,   3,   3,   3,   85,  42,  86, 87,  88,  34,  89,  90,  3,   3,   3,   3,
     3,   3,   3,   3,   91,  3,   92,  3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   93,  3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   94,  3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   95,  3,   96,  97,  98,  99,  94,  100,
     3,   3,   3,   3,   3,   3,   101, 102, 3,   3,  3,   3,   3,   3,   103, 104, 103, 105, 3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  106, 3,   3,   3,   3,   3,   3,   3,   107,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   108, 3,   109, 110, 3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   111, 3,   112, 3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   113, 3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   114, 3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   115, 3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   111, 3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   114, 3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   116, 3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   117, 3,   100,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   118, 119, 3,
     120, 3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   121, 122, 34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  123, 124,
     34,  34,  34,  34,  125, 126, 127, 128, 129, 34, 130, 131, 132, 48,  133, 134, 135, 136, 137,
     138, 139, 140, 141, 142, 143, 144, 34,  145, 34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  34,  34,  34,  34,  34,  34,  34,
     34,  34,  34,  34,  34,  34,  34,  34,  34,  34, 34,  34,  146, 147, 3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   3,   3,   3,   3,   3,   3,
     3,   3,   3,   3,   3,   3,   3,   3,   3,   3,  3,   3,   3,   34,  34,  34,  34,  34,  148,
     34,  149, 150, 151, 152, 153, 34,  154, 34,  34, 155, 156, 157, 158, 3,   159, 34,  160, 161,
     162, 163, 164},
    {0x00000110043fffff, 0x000007ff01ffffff, 0x3fdfffff00000000, 0x0000000000000000,
     0x23fffffffffffff0, 0xfffe0003ff010000, 0x23c5fdfffff99fe1, 0x10030003b0004000,
     0x036dfdfffff987e0, 0x001c00005e000000, 0x23edfdfffffbbfe0, 0x0200000300010000,
     0x23edfdfffff99fe0, 0x00020003b0000000, 0x03ffc718d63dc7e8, 0x0000000000010000,
     0x23fffdfffffddfe0, 0x0000000307000000, 0x23effdfffffddfe1, 0x0006000340000000,
     0x27fffffffffddfe0, 0xfc00000380704000, 0x2ffbfffffc7fffe0, 0x000000000000007f,
     0x0005fffffffffffe, 0x2005ffaffffff7d6, 0x00000000f000005f, 0x0000000000000001,
     0x00001ffffffffeff, 0x0000000000001f00, 0x800007ffffffffff, 0xffe1c0623c3f0000,
     0xffffffff00004003, 0xf7ffffffffff20bf, 0xffffffffffffffff, 0xffffffff3d7f3dff,
     0x7f3dffffffff3dff, 0xffffffffff7fff3d, 0xffffffffff3dffff, 0x0000000007ffffff,
     0xffffffff0000ffff, 0x3f3fffffffffffff, 0xfffffffffffffffe, 0xffff9fffffffffff,
     0xffffffff07fffffe, 0x01ffc7ffffffffff, 0x0003ffff0003dfff, 0x0001dfff0003ffff,
     0x000fffffffffffff, 0x0000000010800000, 0xffffffff00000000, 0x01ffffffffffffff,
     0xffff05ffffffffff, 0x003fffffffffffff, 0x000000007fffffff, 0x001f3fffffff0000,
     0xffff0fffffffffff, 0x00000000000003ff, 0xffffffff007fffff, 0x00000000001fffff,
     0x0000008000000000, 0x000fffffffffffe0, 0x0000000000000fe0, 0xfc00c001fffffff8,
     0x0000003fffffffff, 0x0000000fffffffff, 0x3ffffffffc00e000, 0xe7ffffffffff01ff,
     0x046fde0000000000, 0xffffffff3f3fffff, 0x3fffffffaaff3f3f, 0x5fdfffffffffffff,
     0x1fdc1fff0fcf1fdc, 0x8002000000000000, 0x000000001fff0000, 0xf3fffd503f2ffc84,
     0xffffffff000043e0, 0x00000000000001ff, 0xffff7fffffffffff, 0xffffffff7fffffff,
     0x000c781fffffffff, 0xffff20bfffffffff, 0x000080ffffffffff, 0x7f7f7f7f007fffff,
     0x000000007f7f7f7f, 0x1f3e03fe000000e0, 0xfffffffee07fffff, 0xf7ffffffffffffff,
     0xfffeffffffffffe0, 0x07ffffff00007fff, 0xffff000000000000, 0x0000000000000028,
     0x000000000000000a, 0x0000050000000000, 0x0000000000002800, 0x0010000000000000,
     0x00000000000003ab, 0x0000000028000000, 0xa000000000741400, 0x00000140a0000001,
     0x0001400000000000, 0x0000000000000014, 0x00003e8000000050, 0x8000000000000000,
     0x000000000000143e, 0x000000000000001e, 0x000000000a000000, 0x0282800000000000,
     0x0500000000000000, 0xd000000000000000, 0x000000000001f400, 0x5000000000000000,
     0x0000000000001400, 0x0000000000050000, 0x0000000000000050, 0x0000000000500000,
     0x0000140000000000, 0x000a500000000000, 0x0000000280000000, 0x0140000000001450,
     0x0050000000000000, 0x0400001000000000, 0x0000420000101404, 0x0000000000001fff,
     0x3fffffffffff0000, 0x00000c00ffff1fff, 0x80007fffffffffff, 0xffffffff3fffffff,
     0x0000ffffffffffff, 0xfffffffcff800000, 0xfffffffffffff9ff, 0xff8000000000007c,
     0x00000007fffff7bb, 0x000ffffffffffffc, 0x68fc000000000000, 0xffff003ffffffc00,
     0x1fffffff0000007f, 0x0007fffffffffff0, 0x7c00ffdf00008000, 0x000001ffffffffff,
     0xc47fffff00000ff7, 0x3e62ffffffffffff, 0x001c07ff38000005, 0xffff7f7f007e7e7e,
     0xffff00fff7ffffff, 0x00000007ffffffff, 0xffff000fffffffff, 0x0ffffffffffff87f,
     0xffff3fffffffffff, 0x0000000003ffffff, 0x5f7ffdffa0f8007f, 0xffffffffffffffdb,
     0x0003ffffffffffff, 0xfffffffffff80000, 0xfffffff03fffffff, 0x3fffffffffffffff,
     0xffffffffffff0000, 0xfffffffffffcffff, 0x03ff0000000000ff, 0xaa8a000000000000,
     0x1fffffffffffffff, 0x07fffffe00000000, 0xffffffc007fffffe, 0x7fffffff3fffffff,
     0x000000001cfcfcfc},
    {1,  2,  3, 4,  5,  6, 7, 8, 5, 5, 9, 5, 10, 11, 5, 12, 5, 13, 14, 5, 5, 15, 5, 5, 5, 16,
     17, 18, 5, 19, 20, 5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5, 5,  5, 5,  5,  5, 5},
    {1,   2,   3,   4,   5,  4,   4,  4,   4,   6,   7,   8,   9,  10, 11, 2,   2,  12, 13, 14,
     15,  4,   4,   2,   2,  2,   2,  16,  17,  4,   4,   18,  19, 20, 21, 22,  4,  23, 4,  24,
     25,  26,  27,  28,  29, 30,  4,  2,   31,  32,  32,  15,  4,  4,  4,  4,   4,  4,  4,  33,
     34,  4,   35,  36,  4,  37,  38, 39,  40,  41,  42,  43,  4,  44, 20, 45,  46, 4,  4,  5,
     47,  48,  49,  4,   4,  50,  51, 48,  52,  53,  4,   54,  4,  4,  4,  55,  4,  56, 57, 4,
     4,   58,  59,  60,  61, 62,  63, 4,   4,   4,   4,   64,  65, 66, 4,  67,  68, 69, 4,  4,
     4,   4,   70,  4,   4,  4,   4,  2,   2,   2,   2,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   71,  4,   2,   50, 2,   2,  2,   72,  4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   2,   2,   2,   2,  2,   2,  50,  4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     73,  4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  2,   2,  2,  2,  2,
     2,   2,   2,   63,  20, 4,   74, 48,  75,  66,  4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     2,   4,   4,   2,   76, 77,  78, 2,   2,   2,   2,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   2,   2,   2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  2,  2,   2,  2,  2,  2,
     2,   2,   79,  2,   2,  2,   2,  2,   2,   2,   2,   2,   2,  2,  32, 4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  2,   2,  2,  2,  20,
     80,  2,   2,   2,   2,  2,   81, 4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   2,   82, 83,  4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  2,   84, 85, 86, 87,
     88,  2,   2,   2,   2,  89,  90, 91,  92,  93,  94,  4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  95,  96,  4,   4,   4,   4,  4,  55, 4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  2,   2,  2,  97, 2,
     98,  4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  99,
     100, 101, 4,   4,   4,  4,   4,  102, 103, 4,   104, 105, 4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   106, 4,  107, 4,  4,   4,   4,   108, 109, 4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  110, 4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   111, 4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  112,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   113, 4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   114, 4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  115, 4,  4,  4,  116,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   117, 4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   118, 4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   2,   2,  2,  2,  2,   2,  2,  2,  119,
     4,   4,   4,   4,   4,  4,   4,  4,   4,   4,   4,   4,   4,  4,  4,  4,   4,  4,  4,  4,
     4,   4,   4},
    {0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff,
     0x0000000000000000, 0x001fffffffffffff, 0xffffffff1fffffff, 0x000000000001ffff,
     0xffffe000ffffffff, 0x003fffffffff07ff, 0xffffffff3fffffff, 0x00000000003eff0f,
     0xffff00003fffffff, 0x0fffffffff0fffff, 0xffff00ffffffffff, 0x0000000fffffffff,
     0x007fffffffffffff, 0x000000ff003fffff, 0x91bffffffffffd3f, 0x007fffff003fffff,
     0x000000007fffffff, 0x0037ffff00000000, 0x03ffffff003fffff, 0xc0ffffffffffffff,
     0x003ffffffeef0001, 0x1fffffff00000000, 0x000000001fffffff, 0x0000001ffffffeff,
     0x003fffffffffffff, 0x0007ffff003fffff, 0x000000000003ffff, 0x00000000000001ff,
     0x0007ffffffffffff, 0xffff00801fffffff, 0x000000000000003f, 0x007fffff00000000,
     0x00fffffffffffff8, 0x0000fffffffffff8, 0x000001ffffff0000, 0x0000007ffffffff8,
     0x0047ffffffff0010, 0x0007fffffffffff8, 0x000000001400001e, 0x00000ffffffbffff,
     0xffff01ffbfffbd7f, 0x23edfdfffff99fe0, 0x00000003e0010000, 0x0000000080000780,
     0x0000ffffffffffff, 0x00000000000000b0, 0x00007fffffffffff, 0x000000000f000000,
     0x0000000000000010, 0x010007ffffffffff, 0x0000000007ffffff, 0x00000fffffffffff,
     0xffffffff00000000, 0x80000000ffffffff, 0xfffffcff00000000, 0x0000000a0001ffff,
     0x0407fffffffff801, 0xfffffffff0010000, 0x00000000200003ff, 0x01ffffffffffffff,
     0x00007ffffffffdff, 0xfffc000000000001, 0x000000000000ffff, 0x0001fffffffffb7f,
     0xfffffdbf00000040, 0x00000000010003ff, 0x0007ffff00000000, 0x0000000003ffffff,
     0x000000000000000f, 0x000000000000007f, 0x00003fffffff0000, 0xe0fffff80000000f,
     0x00000000000107ff, 0x00000000fff80000, 0x0000000b00000000, 0x00ffffffffffffff,
     0xffff00f000070000, 0x0fffffffffffffff, 0x1fff07ffffffffff, 0x0000000003ff01ff,
     0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef, 0x7bffffffdfdfe7bf,
     0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xf7fffffff7fffffd, 0xffdfffffffdfffff,
     0xffff7fffffff7fff, 0xfffffdfffffffdff, 0x0000000000000ff7, 0x3f801fffffffffff,
     0x0000000000004000, 0x000000000000001f, 0x000000000000080f, 0x0af7fe96ffffffef,
     0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff, 0x0000000000000003, 0x0000001400000000,
     0x0000000500000000, 0x0000000280000000, 0x0000050000000000, 0x000000001400140a,
     0x2800050000000000, 0x0000000002800000, 0x0000000000014000, 0x0000000001400000,
     0x000000000a000000, 0x0000280000000000, 0x0000000000200000, 0x0008000000000000,
     0x0000000010000000, 0x0000000100000000, 0x0000000080000000, 0x000000003fffffff}};
template<>
constexpr bool cp_is<property::ahex>(char32_t c) {
    return __prop_ahex_data.lookup(c);
}
template<>
constexpr bool cp_is<property::alpha>(char32_t c) {
    return __prop_alpha_data.lookup(c);
}
template<>
constexpr bool cp_is<property::bidi_c>(char32_t c) {
    return __prop_bidi_c_data.lookup(c);
}
template<>
constexpr bool cp_is<property::bidi_m>(char32_t c) {
    return __prop_bidi_m_data.lookup(c);
}
template<>
constexpr bool cp_is<property::dash>(char32_t c) {
    return __prop_dash_data.lookup(c);
}
template<>
constexpr bool cp_is<property::dep>(char32_t c) {
    return __prop_dep_data.lookup(c);
}
template<>
constexpr bool cp_is<property::dia>(char32_t c) {
    return __prop_dia_data.lookup(c);
}
template<>
constexpr bool cp_is<property::emoji>(char32_t c) {
    return __prop_emoji_data.lookup(c);
}
template<>
constexpr bool cp_is<property::emoji_component>(char32_t c) {
    return __prop_emoji_component_data.lookup(c);
}
template<>
constexpr bool cp_is<property::emoji_modifier>(char32_t c) {
    return __prop_emoji_modifier_data.lookup(c);
}
template<>
constexpr bool cp_is<property::emoji_modifier_base>(char32_t c) {
    return __prop_emoji_modifier_base_data.lookup(c);
}
template<>
constexpr bool cp_is<property::emoji_presentation>(char32_t c) {
    return __prop_emoji_presentation_data.lookup(c);
}
template<>
constexpr bool cp_is<property::ext>(char32_t c) {
    return __prop_ext_data.lookup(c);
}
template<>
constexpr bool cp_is<property::extended_pictographic>(char32_t c) {
    return __prop_extended_pictographic_data.lookup(c);
}
template<>
constexpr bool cp_is<property::gr_base>(char32_t c) {
    return __prop_gr_base_data.lookup(c);
}
template<>
constexpr bool cp_is<property::hex>(char32_t c) {
    return __prop_hex_data.lookup(c);
}
template<>
constexpr bool cp_is<property::ideo>(char32_t c) {
    return __prop_ideo_data.lookup(c);
}
template<>
constexpr bool cp_is<property::idsb>(char32_t c) {
    return __prop_idsb_data.lookup(c);
}
template<>
constexpr bool cp_is<property::idst>(char32_t c) {
    return __prop_idst_data.lookup(c);
}
template<>
constexpr bool cp_is<property::join_c>(char32_t c) {
    return __prop_join_c_data.lookup(c);
}
template<>
constexpr bool cp_is<property::loe>(char32_t c) {
    return __prop_loe_data.lookup(c);
}
template<>
constexpr bool cp_is<property::pat_syn>(char32_t c) {
    return __prop_pat_syn_data.lookup(c);
}
template<>
constexpr bool cp_is<property::pat_ws>(char32_t c) {
    return __prop_pat_ws_data.lookup(c);
}
template<>
constexpr bool cp_is<property::pcm>(char32_t c) {
    return __prop_pcm_data.lookup(c);
}
template<>
constexpr bool cp_is<property::qmark>(char32_t c) {
    return __prop_qmark_data.lookup(c);
}
template<>
constexpr bool cp_is<property::radical>(char32_t c) {
    return __prop_radical_data.lookup(c);
}
template<>
constexpr bool cp_is<property::ri>(char32_t c) {
    return __prop_ri_data.lookup(c);
}
template<>
constexpr bool cp_is<property::sd>(char32_t c) {
    return __prop_sd_data.lookup(c);
}
template<>
constexpr bool cp_is<property::sterm>(char32_t c) {
    return __prop_sterm_data.lookup(c);
}
template<>
constexpr bool cp_is<property::term>(char32_t c) {
    return __prop_term_data.lookup(c);
}
template<>
constexpr bool cp_is<property::uideo>(char32_t c) {
    return __prop_uideo_data.lookup(c);
}
template<>
constexpr bool cp_is<property::vs>(char32_t c) {
    return __prop_vs_data.lookup(c);
}
template<>
constexpr bool cp_is<property::wspace>(char32_t c) {
    return __prop_wspace_data.lookup(c);
}
template<>
constexpr bool cp_is<property::xidc>(char32_t c) {
    return __prop_xidc_data.lookup(c);
}
template<>
constexpr bool cp_is<property::xids>(char32_t c) {
    return __prop_xids_data.lookup(c);
}
static constexpr __bool_trie<32, 991, 1, 0, 149, 255, 1, 0, 1471, 1, 0, 158> __prop_assigned{
    {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffffff, 0xfcffffffffffffff, 0xfffffffbffffd7f0, 0xffffffffffffffff,
     0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xfffeffffffffffff, 0xfffffffffe7fffff, 0xfffffffffffee7ff, 0x001f87ffffff00ff,
     0xffffffffdfffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
     0xffffffffffffbfff, 0xffffffffffffe7ff, 0x0003ffffffffffff, 0xe7ffffffffffffff},
    {1,   2,   3,   4,  4,   5,   6,   7,   8,   9,   10,  11,  12,  13, 14,  15,  16, 17, 18,  19,
     20,  21,  22,  23, 24,  25,  26,  4,   27,  28,  29,  4,   4,   4,  30,  4,   4,  4,  4,   4,
     31,  32,  33,  34, 35,  36,  37,  4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  38, 39,  40,
     41,  4,   42,  43, 39,  44,  45,  46,  47,  48,  49,  50,  51,  52, 53,  4,   54, 4,  55,  56,
     57,  58,  59,  4,  4,   4,   60,  4,   4,   4,   4,   61,  62,  63, 64,  4,   65, 66, 67,  4,
     4,   68,  4,   4,  4,   4,   4,   4,   4,   4,   4,   69,  70,  4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     71,  72,  4,   73, 74,  4,   75,  76,  77,  78,  79,  4,   80,  81, 82,  4,   4,  4,  83,  4,
     84,  85,  4,   86, 4,   87,  88,  74,  4,   4,   89,  4,   4,   4,  4,   90,  53, 91, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  92,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 93,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 94, 4,   95,
     96,  97,  98,  93, 99,  53,  53,  53,  53,  53,  53,  100, 101, 53, 53,  53,  53, 53, 53,  102,
     103, 102, 104, 53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 105, 53,  53, 53, 53,  53,
     53,  53,  106, 53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 107, 53,  108, 109, 53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  110, 53, 111, 53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  112, 53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  113, 53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  114, 53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     110, 53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  113, 53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  115, 53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  116, 53,  99,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  117, 118, 53,  119, 53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  120, 121, 4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   122, 123, 4,   4,   4,   4,   124, 4,   4,  125, 4,   4,  4,  126, 127,
     125, 4,   128, 4,  129, 4,   130, 131, 132, 4,   133, 134, 135, 4,  136, 4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   4,   4,   4,   4,   4,  4,   4,   4,  4,  4,   4,
     4,   4,   4,   4,  4,   4,   4,   4,   4,   88,  137, 53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53, 53,  53,  53, 53, 53,  53,
     53,  53,  53,  4,  4,   4,   4,   4,   138, 4,   139, 140, 141, 4,  142, 4,   4,  4,  4,   4,
     143, 144, 145, 36, 146, 4,   147, 84,  4,   89,  148},
    {0x7fff3fffffffffff, 0x000007ff4fffffff, 0x3fdfffff00000000, 0xfffffffffff80000,
     0xffffffffffffffff, 0xf3c5fdfffff99fef, 0x7fffffcfb080799f, 0xd36dfdfffff987ee,
     0x007fffc05e023987, 0xf3edfdfffffbbfee, 0xfe03ffcf00013bbf, 0xf3edfdfffff99fee,
     0x00ffffcfb0c0399f, 0xc3ffc718d63dc7ec, 0x07ffffc000813dc7, 0xe3fffdfffffddfff,
     0xff80ffcf07603ddf, 0xf3effdfffffddfff, 0x0006ffcf40603ddf, 0xfffffffffffddfef,
     0xffffffcffff0fddf, 0x2ffbfffffc7fffec, 0x001cffc0ff5f847f, 0x87fffffffffffffe,
     0x000000000fffffff, 0x3fffffaffffff7d6, 0x00000000f3ff3f5f, 0xfffe1ffffffffeff,
     0xdffffffffeffffff, 0x0000000007ffdfff, 0xffffffffffff20bf, 0xffffffff3d7f3dff,
     0x7f3dffffffff3dff, 0xffffffffff7fff3d, 0xffffffffff3dffff, 0x1fffffffe7ffffff,
     0xffffffff03ffffff, 0x3f3fffffffffffff, 0xffffffff1fffffff, 0x01ffffffffffffff,
     0x007fffff001fdfff, 0x000ddfff000fffff, 0x03ff03ff3fffffff, 0xffffffff03ff7fff,
     0xffff07ffffffffff, 0x003fffffffffffff, 0x0fff0fff7fffffff, 0x001f3ffffffffff1,
     0xffff0fffffffffff, 0xffffffffc7ff03ff, 0xffffffffcfffffff, 0x9fffffff7fffffff,
     0x7fff3fff03ff03ff, 0x0000000000000000, 0x1fffffffffff0fff, 0xf00fffffffffffff,
     0xf8ffffffffffffff, 0xffffffffffffe3ff, 0xe7ffffffffff01ff, 0x07ffffffffff00ff,
     0xfbffffffffffffff, 0xffffffff3f3fffff, 0x3fffffffaaff3f3f, 0xffdfffffffffffff,
     0x7fdcffffefcfffdf, 0xfff3ffdfffffffff, 0xffffffff1fff7fff, 0x0001ffffffff0000,
     0xffffffffffff0fff, 0x0000007fffffffff, 0xffffffff000007ff, 0xffcfffffffffffff,
     0xffffffffff3fffff, 0xffff7fffffffffff, 0xffffffff7fffffff, 0xfe0fffffffffffff,
     0xffff20bfffffffff, 0x800180ffffffffff, 0x7f7f7f7f007fffff, 0xffffffff7f7f7f7f,
     0x000000000000ffff, 0xfffffffffbffffff, 0x000fffffffffffff, 0x0fff0000003fffff,
     0xfffffffffffffffe, 0xfffffffffe7fffff, 0xfffeffffffffffe0, 0x07ffffffffff7fff,
     0xffff000fffffffff, 0x7fffffffffffffff, 0x0000000000000028, 0x000000000000000a,
     0x0000050000000000, 0x0000000000002800, 0x0010000000000000, 0x00000000000003ab,
     0x0000000028000000, 0xa000000000741400, 0x00000140a0000001, 0x0001400000000000,
     0x0000000000000014, 0x00003e8000000050, 0x8000000000000000, 0x000000000000143e,
     0x000000000000001e, 0x000000000a000000, 0x0282800000000000, 0x0500000000000000,
     0xd000000000000000, 0x000000000001f400, 0x5000000000000000, 0x0000000000001400,
     0x0000000000050000, 0x0000000000000050, 0x0000000000500000, 0x0000140000000000,
     0x000a500000000000, 0x0000000280000000, 0x0140000000001450, 0x0050000000000000,
     0x0400001000000000, 0x0000420000101404, 0xffffffffffff1fff, 0xffffffffffff007f,
     0x00000fffffffffff, 0x00ffffffffffffff, 0xff8000000000007c, 0x03ff0fffffffffff,
     0xffffffff03ffc03f, 0x1fffffff800fffff, 0x7fffffffc3ffbfff, 0x007fffffffffffff,
     0xfffffffff3ff3fff, 0x007ffffff8000007, 0xffff7f7f007e7e7e, 0xffff00ffffffffff,
     0x03ff3fffffffffff, 0x0ffffffffffff87f, 0xffff3fffffffffff, 0x0000000003ffffff,
     0x5f7fffffe0f8007f, 0xffffffffffffffdb, 0xfffffffffff80003, 0xffffffffffff0000,
     0xfffffffffffcffff, 0x3fff0000000000ff, 0xffdf0f7ffff7ffff, 0x9fffffffffffffff,
     0x3e007f7f1cfcfcfc},
    {1,  2,  3, 4,  5,  6, 7, 8, 5, 5, 9, 5, 10, 11, 12, 13, 5, 14, 15, 5, 5, 16, 5, 5, 5, 17,
     18, 19, 5, 20, 21, 5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 22,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5, 5,  5, 5, 5, 5,
     5,  5,  5, 5,  5,  5, 5, 5, 5, 5, 5, 5, 5,  5,  5,  5,  5, 5,  5,  5, 5},
    {1,   2,   3,   4,   2,   5,   6,   7,   7,   8,   9,   10,  11,  12,  13,  2,   2,   14,  15,
     16,  17,  7,   7,   2,   2,   2,   2,   18,  19,  7,   7,   20,  21,  22,  23,  24,  7,   25,
     26,  27,  28,  29,  30,  31,  32,  33,  7,   2,   34,  35,  36,  37,  7,   7,   7,   7,   38,
     7,   7,   16,  39,  7,   40,  2,   41,  2,   42,  43,  44,  2,   45,  46,  7,   47,  48,  49,
     50,  7,   7,   2,   51,  2,   52,  7,   7,   53,  54,  2,   55,  56,  57,  58,  7,   7,   7,
     59,  7,   60,  61,  7,   7,   62,  63,  2,   64,  65,  56,  7,   7,   7,   7,   66,  67,  68,
     7,   69,  70,  71,  7,   7,   7,   7,   72,  7,   7,   7,   73,  2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   39,  7,   2,   74,  2,   2,   2,   75,  7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   76,  7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   2,   2,   2,   2,   2,   2,   2,   2,   2,   77,  7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   2,   2,
     2,   2,   2,   2,   2,   56,  78,  7,   79,  2,   80,  81,  7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   2,   82,  7,   2,   83,  84,  85,  2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   86,  2,   2,   2,   2,   2,   2,   2,   2,
     2,   2,   2,   35,  7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   2,   2,   2,   2,   87,  88,  2,   2,   2,   2,   2,   59,  7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   89,  90,  7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   2,   2,   91,  92,  2,   2,
     93,  2,   94,  7,   95,  2,   96,  7,   7,   2,   97,  98,  99,  100, 101, 2,   2,   2,   2,
     102, 2,   2,   2,   2,   103, 2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   104, 7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     105, 7,   7,   7,   106, 107, 7,   7,   7,   7,   7,   108, 7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   2,   2,   2,   109, 2,   110,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   111, 112, 7,   113, 7,   7,   7,   114,
     115, 116, 117, 7,   7,   7,   7,   118, 2,   119, 120, 121, 122, 123, 124, 125, 126, 7,   7,
     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   127, 2,   128, 2,
     129, 130, 131, 132, 7,   133, 134, 135, 136, 2,   137, 138, 7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   139, 140, 7,   141, 142,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   143, 7,   144, 7,   7,   7,   7,
     145, 146, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   147, 7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   148, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   149, 7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   150, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   151, 7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   152, 7,   7,   7,   153, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     154, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   155, 7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   2,   2,   2,   2,   2,   2,   2,   2,   54,  7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   156, 2,   7,   7,   2,   2,   2,   157, 7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,   7,
     7,   7,   7,   7,   7,   7,   7,   7},
    {0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff,
     0xff8fffffffffff87, 0x000000010fff7fff, 0x3fffffffffff0000, 0x0000000000000000,
     0xffffffff1fffffff, 0x0fffffff0001ffff, 0xffffe00fffffffff, 0x07ffffffffff07ff,
     0xffffffffbfffffff, 0x00000000003fff0f, 0xffff03ff3fffffff, 0x0fffffffff0fffff,
     0xffff00ffffffffff, 0x0000800fffffffff, 0x007fffffffffffff, 0x000000ff003fffff,
     0x91bffffffffffd3f, 0xffffffffffbfffff, 0x0000ff807fffffff, 0xf837ffff00000000,
     0x83ffffff8fffffff, 0xf0ffffffffffffff, 0xfffffffffffcffff, 0x873ffffffeeff06f,
     0xffffffff01ff01ff, 0x00000000ffffffff, 0x007ff87fffffffff, 0xfe3fffffffffffff,
     0xff07ffffff3fffff, 0x0000fe001e03ffff, 0x00000000000001ff, 0x0007ffffffffffff,
     0xfc07ffffffffffff, 0x03ff00ffffffffff, 0x7fffffff00000000, 0x0000000003ffffff,
     0x007fffff00000000, 0x8000fffffffc3fff, 0x03ff01ffffff2003, 0xffdfffffffffffff,
     0x007fffffffff007f, 0x001ffffeffff3fff, 0x7ffffffffffbffff, 0xffff03ffbfffbd7f,
     0x03ff07ffffffffff, 0xfbedfdfffff99fef, 0x001f1fcfe081399f, 0x00000000ebffffff,
     0x0000000003ff00ff, 0xff3fffffffffffff, 0x000000003fffffff, 0x00001fff03ff001f,
     0x01ffffffffffffff, 0x00000000000003ff, 0xffff0fffe7ffffff, 0x0fffffffffffffff,
     0xffffffff00000000, 0x8007ffffffffffff, 0xfffffcff00000000, 0x0000001ffcffffff,
     0xffffffffffff00ff, 0x00000007ffffffff, 0xff7ffffffffffdff, 0xffff1fffffff003f,
     0x007ffefffffcffff, 0xb47ffffffffffb7f, 0xfffffdbf03ff00ff, 0x000003ff01fb7fff,
     0x01ffffff00000000, 0x8003ffffffffffff, 0x001f7fffffffffff, 0x000000000000000f,
     0x01ff7fffffffffff, 0x000000000000007f, 0x0000c3ff7fffffff, 0x003f3fffffff0000,
     0xe0fffffbfbff003f, 0x000000000000ffff, 0x0000000007ffffff, 0xffffffffffff87ff,
     0x00000000ffff80ff, 0x0000000f00000000, 0x00ffffffffffffff, 0x000000007fffffff,
     0xffff00f000070000, 0x1fff07ffffffffff, 0x0000000ff3ff01ff, 0x003fffffffffffff,
     0xfffffe7fffffffff, 0x000001ffffffffff, 0x000000000000003f, 0x000fffff00000000,
     0x01ffffff007fffff, 0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef,
     0x7bffffffdfdfe7bf, 0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xffffffffffffcfff,
     0x0000fffef8000fff, 0x000007dbf9ffff7f, 0x3fff1fffffffffff, 0x000000000000c3ff,
     0x83ffffffffffffff, 0x00000000007fff9f, 0x00000000c3ff0fff, 0xfffe000000000000,
     0x001fffffffffffff, 0x3ffffffffffffffe, 0x0af7fe96ffffffef, 0x5ef7f796aa96ea84,
     0x0ffffbee0ffffbff, 0x0003000000000000, 0xffff0fffffffffff, 0xfffe7fff000fffff,
     0x003ffffffffefffe, 0xffffffffffff1fff, 0xffff1fffffffffff, 0x00001fffffffffff,
     0xffffffc000000000, 0x0fffffffffff0007, 0x0000003f000301ff, 0x07ff1fff003fffff,
     0x000fffffffffffff, 0x00000fff01ffffff, 0xffffffffffff0fff, 0xffffffff03ff00ff,
     0x00003fffffff00ff, 0xffffffffffffefff, 0xfc7bffffffffffff, 0xffffc7e7ffffffff,
     0xffffffffffffe7ff, 0x070f3fff000fffff, 0x00000000003f0007, 0x0000000000000003,
     0x0000001400000000, 0x0000000500000000, 0x0000000280000000, 0x0000050000000000,
     0x000000001400140a, 0x2800050000000000, 0x0000000002800000, 0x0000000000014000,
     0x0000000001400000, 0x000000000a000000, 0x0000280000000000, 0x0000000000200000,
     0x0008000000000000, 0x0000000010000000, 0x0000000100000000, 0x0000000080000000,
     0xffffffff00000002, 0x0000ffffffffffff}};
}    // namespace uni

#include <string_view>

namespace uni {

enum class property;


template<uni::version v>
constexpr category cp_category(char32_t cp) {
    static_assert(v >= uni::version::minimum_version,
                  "This version of the Unicode Database is not supported");
    if constexpr(v != uni::version::latest_version) {
        if(cp_age(cp) > v)
            return category::cn;
    }
    if(cp > 0x10FFFF)
        return category::unassigned;
    return __get_category<uni::version::latest_version>(cp);
}

constexpr uni::version __age_from_string(std::string_view a) {
    for(std::size_t i = 0; i < __age_strings.size(); ++i) {
        const auto res = __pronamecomp(a, __age_strings[i]);
        if(res == 0)
            return uni::version(i);
    }
    return uni::version::unassigned;
}

constexpr category __category_from_string(const std::string_view s) {
    for(std::size_t i = 0; i < __categories_names.size(); ++i) {
        const auto& c = __categories_names[i];
        const auto res = __pronamecomp(s, c.name);
        if(res == 0)
            return category(c.value);
    }
    return category::unassigned;
}

constexpr block __block_from_string(const std::string_view s) {
    for(std::size_t i = 0; i < __blocks_names.size(); ++i) {
        const auto& c = __blocks_names[i];
        const auto res = __pronamecomp(s, c.name);
        if(res == 0)
            return block(c.value);
    }
    return block::no_block;
}

constexpr script __script_from_string(const std::string_view s) {
    for(std::size_t i = 0; i < __scripts_names.size(); ++i) {
        const auto& c = __scripts_names[i];
        const auto res = __pronamecomp(s, c.name);
        if(res == 0)
            return script(c.value);
    }
    return script::unknown;
}

template<uni::version v = uni::version::standard_unicode_version>
constexpr script cp_script(char32_t cp) {
    static_assert(v >= uni::version::minimum_version,
                  "This version of the Unicode Database is not supported");
    if constexpr(v != uni::version::latest_version) {
        if(cp_age(cp) > v)
            return script::zzzz;
    }
    return __cp_script<0, v>(cp);
}

template<uni::version v = uni::version::standard_unicode_version>
struct script_extensions_view {
    constexpr script_extensions_view(char32_t c) : c(c){};

    struct sentinel {};
    struct iterator {

        using value_type = script;
        using iterator_category = std::forward_iterator_tag;

        constexpr iterator(char32_t c) : m_c(c), m_script(__get_cp_script<v>(m_c, 1)) {
            if(m_script == script::unknown)
                m_script = __cp_script<0, v>(m_c);
        }
        constexpr script operator*() const {
            return m_script;
        };

        constexpr iterator& operator++(int) {
            idx++;
            m_script = __get_cp_script<v>(m_c, idx);
            return this;
        }

        constexpr iterator operator++() {
            auto c = *this;
            idx++;
            m_script = __get_cp_script<v>(m_c, idx);
            return c;
        }

        constexpr bool operator==(sentinel) const {
            return m_script == script::unknown;
        };
        constexpr bool operator!=(sentinel) const {
            return m_script != script::unknown;
        };
        constexpr bool operator==(iterator it) const {
            return m_script == it.m_script && m_c == it.m_c;
        };
        constexpr bool operator!=(iterator it) const {
            return !(*this == it);
        };

    private:
        char32_t m_c;
        script m_script;
        int idx = 1;
    };

    constexpr iterator begin() const {
        return iterator{c};
    }
    constexpr sentinel end() const {
        return {};
    }

private:
    char32_t c;
};

template<uni::version v = uni::version::standard_unicode_version>
constexpr auto cp_script_extensions(char32_t cp) {
    static_assert(v >= uni::version::minimum_version,
                  "This version of the Unicode Database is not supported");
    if constexpr(v != uni::version::latest_version) {
        if(cp_age(cp) > v)
            return script::zzzz;
    }
    return script_extensions_view<v>(cp);
}


constexpr version cp_age(char32_t cp) {
    return static_cast<version>(uni::__age_data.value(cp, uint8_t(version::unassigned)));
}

constexpr block cp_block(char32_t cp) {
    const auto end = __block_data._data.end();
    auto it = uni::upper_bound(__block_data._data.begin(), end, cp, [](char32_t cp, uint32_t v) {
        char32_t c = (v >> 8);
        return cp < c;
    });
    if(it == end)
        return block::no_block;
    it--;
    auto offset = (*it) & 0xFF;
    if(offset == 0)
        return block::no_block;
    offset--;

    const auto d = std::distance(__block_data._data.begin(), it);
    return uni::block((d - offset) + 1);
}

template<>
constexpr bool cp_is<property::noncharacter_code_point>(char32_t cp) {
    return (char32_t(cp) & 0xfffe) == 0xfffe || (char32_t(cp) >= 0xfdd0 && char32_t(cp) <= 0xfdef);
}

// http://unicode.org/reports/tr44/#Lowercase
template<>
constexpr bool cp_is<property::lowercase>(char32_t cp) {
    return uni::__cat_ll.lookup(char32_t(cp)) || uni::__prop_olower_data.lookup(char32_t(cp));
}

// http://unicode.org/reports/tr44/#Uppercase
template<>
constexpr bool cp_is<property::uppercase>(char32_t cp) {
    return uni::__cat_lu.lookup(char32_t(cp)) || uni::__prop_oupper_data.lookup(char32_t(cp));
}

// http://unicode.org/reports/tr44/#Cased
template<>
constexpr bool cp_is<property::cased>(char32_t cp) {
    return cp_is<property::lower>(cp) || cp_is<property::upper>(cp) ||
           uni::__cat_lt.lookup(char32_t(cp));
}

// http://unicode.org/reports/tr44/#Math
template<>
constexpr bool cp_is<property::math>(char32_t cp) {
    return uni::__cat_sm.lookup(char32_t(cp)) || __prop_omath_data.lookup(cp);
}

// http://unicode.org/reports/tr44/#Case_Ignorable
template<>
constexpr bool cp_is<property::case_ignorable>(char32_t) {
    return false;
}


// http://unicode.org/reports/tr44/#Grapheme_Extend
template<>
constexpr bool cp_is<property::grapheme_extend>(char32_t cp) {
    return uni::__cat_me.lookup(char32_t(cp)) || uni::__cat_mn.lookup(char32_t(cp)) ||
           __prop_ogr_ext_data.lookup(cp);
}

constexpr bool cp_is_valid(char32_t cp) {
    return char32_t(cp) <= 0x10FFFF;
}
constexpr bool cp_is_assigned(char32_t cp) {
    return uni::__prop_assigned.lookup(char32_t(cp));
}

constexpr bool cp_is_ascii(char32_t cp) {
    return char32_t(cp) <= 0x7F;
}

template<>
constexpr bool cp_is<property::default_ignorable_code_point>(char32_t cp) {
    const auto c = char32_t(cp);
    const bool maybe = uni::__prop_odi_data.lookup(cp) || uni::__cat_cf.lookup(cp) ||
                       uni::__prop_vs_data.lookup(cp);
    if(!maybe)
        return false;
    // ignore (Interlinear annotation format characters
    if(c >= 0xFFF9 && c <= 0xFFFB) {
        return false;
    }
    // Ignore Egyptian hieroglyph format characters
    else if(c >= 0x13430 && c <= 0x13438) {
        return false;
    } else if(uni::__prop_wspace_data.lookup(cp))
        return false;
    else if(uni::__prop_pcm_data.lookup(cp))
        return false;
    return true;
}

// http://www.unicode.org/reports/tr31/#D1
template<>
constexpr bool cp_is<property::id_start>(char32_t cp) {
    const bool maybe =
        cp_is<category::letter>(cp) || __cat_nl.lookup(cp) || __prop_oids_data.lookup(cp);
    if(!maybe)
        return false;
    return !__prop_pat_syn_data.lookup(cp) && !__prop_pat_ws_data.lookup(cp);
}

template<>
constexpr bool cp_is<property::id_continue>(char32_t cp) {
    const bool maybe = cp_is<category::letter>(cp) || __cat_nl.lookup(cp) ||
                       __prop_oids_data.lookup(cp) || __cat_mn.lookup(cp) || __cat_mc.lookup(cp) ||
                       __cat_nd.lookup(cp) || __cat_pc.lookup(cp) || __prop_oidc_data.lookup(cp);
    if(!maybe)
        return false;
    return !__prop_pat_syn_data.lookup(cp) && !__prop_pat_ws_data.lookup(cp);
}

template<typename Array, typename Res = long long>
constexpr bool _get_numeric_value(char32_t cp, const Array& array, Res& res) {
    auto it = uni::lower_bound(array.begin(), array.end(), cp,
                               [](const auto& d, char32_t cp) { return d.first < cp; });
    if(it == array.end() || it->first != cp)
        return false;
    res = it->second;
    return true;
}

constexpr numeric_value cp_numeric_value(char32_t cp) {
    long long res = 0;
    if(!(_get_numeric_value(cp, __numeric_data64, res) ||
             _get_numeric_value(cp, __numeric_data32, res) ||
             _get_numeric_value(cp, __numeric_data16, res) || [&res, cp]() -> bool {
           res = __numeric_data8.value(cp, 255);
           return res != 255;
       }())) {
        return {};
    }
    uint16_t d = 1;
    _get_numeric_value(cp, __numeric_data_d, d);
    return numeric_value(res, d);
}


}    // namespace uni

namespace uni {
enum class __binary_prop {
    ahex,
    alpha,
    bidi_c,
    bidi_m,
    cased,
    ci,
    dash,
    dep,
    di,
    dia,
    emoji,
    emoji_component,
    emoji_modifier,
    emoji_modifier_base,
    emoji_presentation,
    ext,
    extended_pictographic,
    gr_base,
    gr_ext,
    hex,
    idc,
    ideo,
    ids,
    idsb,
    idst,
    join_c,
    loe,
    lower,
    math,
    nchar,
    pat_syn,
    pat_ws,
    pcm,
    qmark,
    radical,
    ri,
    sd,
    sterm,
    term,
    uideo,
    upper,
    vs,
    wspace,
    xidc,
    xids,
    any,
    ascii,
    assigned,
    c,
    cc,
    cf,
    cn,
    co,
    cs,
    l,
    lc,
    ll,
    lm,
    lo,
    lt,
    lu,
    m,
    mc,
    me,
    mn,
    n,
    nd,
    nl,
    no,
    p,
    pc,
    pd,
    pe,
    pf,
    pi,
    po,
    ps,
    s,
    sc,
    sk,
    sm,
    so,
    z,
    zl,
    zp,
    zs,
    adlm,
    aghb,
    ahom,
    arab,
    armi,
    armn,
    avst,
    bali,
    bamu,
    bass,
    batk,
    beng,
    bhks,
    bopo,
    brah,
    brai,
    bugi,
    buhd,
    cakm,
    cans,
    cari,
    cham,
    cher,
    copt,
    cprt,
    cyrl,
    deva,
    dogr,
    dsrt,
    dupl,
    egyp,
    elba,
    elym,
    ethi,
    geor,
    glag,
    gong,
    gonm,
    goth,
    gran,
    grek,
    gujr,
    guru,
    hang,
    hani,
    hano,
    hatr,
    hebr,
    hira,
    hluw,
    hmng,
    hmnp,
    hrkt,
    hung,
    ital,
    java,
    kali,
    kana,
    khar,
    khmr,
    khoj,
    knda,
    kthi,
    lana,
    laoo,
    latn,
    lepc,
    limb,
    lina,
    linb,
    lisu,
    lyci,
    lydi,
    mahj,
    maka,
    mand,
    mani,
    marc,
    medf,
    mend,
    merc,
    mero,
    mlym,
    modi,
    mong,
    mroo,
    mtei,
    mult,
    mymr,
    nand,
    narb,
    nbat,
    newa,
    nkoo,
    nshu,
    ogam,
    olck,
    orkh,
    orya,
    osge,
    osma,
    palm,
    pauc,
    perm,
    phag,
    phli,
    phlp,
    phnx,
    plrd,
    prti,
    rjng,
    rohg,
    runr,
    samr,
    sarb,
    saur,
    sgnw,
    shaw,
    shrd,
    sidd,
    sind,
    sinh,
    sogd,
    sogo,
    sora,
    soyo,
    sund,
    sylo,
    syrc,
    tagb,
    takr,
    tale,
    talu,
    taml,
    tang,
    tavt,
    telu,
    tfng,
    tglg,
    thaa,
    thai,
    tibt,
    tirh,
    ugar,
    vaii,
    wara,
    wcho,
    xpeo,
    xsux,
    yiii,
    zanb,
    zinh,
    zyyy,
    zzzz,
    unknown
};

template<uni::__binary_prop p>
constexpr bool __get_binary_prop(char32_t) = delete;
// Forward declared - defined in unicode.h
template<uni::version v>
constexpr script cp_script(char32_t cp);

template<>
constexpr bool __get_binary_prop<__binary_prop::ahex>(char32_t c) {
    return cp_is<property::ahex>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::alpha>(char32_t c) {
    return cp_is<property::alpha>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bidi_c>(char32_t c) {
    return cp_is<property::bidi_c>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bidi_m>(char32_t c) {
    return cp_is<property::bidi_m>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cased>(char32_t c) {
    return cp_is<property::cased>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ci>(char32_t c) {
    return cp_is<property::ci>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::dash>(char32_t c) {
    return cp_is<property::dash>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::dep>(char32_t c) {
    return cp_is<property::dep>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::di>(char32_t c) {
    return cp_is<property::di>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::dia>(char32_t c) {
    return cp_is<property::dia>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::emoji>(char32_t c) {
    return cp_is<property::emoji>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::emoji_component>(char32_t c) {
    return cp_is<property::emoji_component>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::emoji_modifier>(char32_t c) {
    return cp_is<property::emoji_modifier>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::emoji_modifier_base>(char32_t c) {
    return cp_is<property::emoji_modifier_base>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::emoji_presentation>(char32_t c) {
    return cp_is<property::emoji_presentation>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ext>(char32_t c) {
    return cp_is<property::ext>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::extended_pictographic>(char32_t c) {
    return cp_is<property::extended_pictographic>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::gr_base>(char32_t c) {
    return cp_is<property::gr_base>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::gr_ext>(char32_t c) {
    return cp_is<property::gr_ext>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hex>(char32_t c) {
    return cp_is<property::hex>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::idc>(char32_t c) {
    return cp_is<property::idc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ideo>(char32_t c) {
    return cp_is<property::ideo>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ids>(char32_t c) {
    return cp_is<property::ids>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::idsb>(char32_t c) {
    return cp_is<property::idsb>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::idst>(char32_t c) {
    return cp_is<property::idst>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::join_c>(char32_t c) {
    return cp_is<property::join_c>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::loe>(char32_t c) {
    return cp_is<property::loe>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lower>(char32_t c) {
    return cp_is<property::lower>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::math>(char32_t c) {
    return cp_is<property::math>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nchar>(char32_t c) {
    return cp_is<property::nchar>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pat_syn>(char32_t c) {
    return cp_is<property::pat_syn>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pat_ws>(char32_t c) {
    return cp_is<property::pat_ws>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pcm>(char32_t c) {
    return cp_is<property::pcm>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::qmark>(char32_t c) {
    return cp_is<property::qmark>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::radical>(char32_t c) {
    return cp_is<property::radical>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ri>(char32_t c) {
    return cp_is<property::ri>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sd>(char32_t c) {
    return cp_is<property::sd>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sterm>(char32_t c) {
    return cp_is<property::sterm>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::term>(char32_t c) {
    return cp_is<property::term>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::uideo>(char32_t c) {
    return cp_is<property::uideo>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::upper>(char32_t c) {
    return cp_is<property::upper>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::vs>(char32_t c) {
    return cp_is<property::vs>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::wspace>(char32_t c) {
    return cp_is<property::wspace>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::xidc>(char32_t c) {
    return cp_is<property::xidc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::xids>(char32_t c) {
    return cp_is<property::xids>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::c>(char32_t c) {
    return cp_is<category::c>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cc>(char32_t c) {
    return cp_is<category::cc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cf>(char32_t c) {
    return cp_is<category::cf>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cn>(char32_t c) {
    return cp_is<category::cn>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::co>(char32_t c) {
    return cp_is<category::co>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cs>(char32_t c) {
    return cp_is<category::cs>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::l>(char32_t c) {
    return cp_is<category::l>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lc>(char32_t c) {
    return cp_is<category::lc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ll>(char32_t c) {
    return cp_is<category::ll>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lm>(char32_t c) {
    return cp_is<category::lm>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lo>(char32_t c) {
    return cp_is<category::lo>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lt>(char32_t c) {
    return cp_is<category::lt>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lu>(char32_t c) {
    return cp_is<category::lu>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::m>(char32_t c) {
    return cp_is<category::m>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mc>(char32_t c) {
    return cp_is<category::mc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::me>(char32_t c) {
    return cp_is<category::me>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mn>(char32_t c) {
    return cp_is<category::mn>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::n>(char32_t c) {
    return cp_is<category::n>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nd>(char32_t c) {
    return cp_is<category::nd>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nl>(char32_t c) {
    return cp_is<category::nl>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::no>(char32_t c) {
    return cp_is<category::no>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::p>(char32_t c) {
    return cp_is<category::p>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pc>(char32_t c) {
    return cp_is<category::pc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pd>(char32_t c) {
    return cp_is<category::pd>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pe>(char32_t c) {
    return cp_is<category::pe>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pf>(char32_t c) {
    return cp_is<category::pf>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pi>(char32_t c) {
    return cp_is<category::pi>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::po>(char32_t c) {
    return cp_is<category::po>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ps>(char32_t c) {
    return cp_is<category::ps>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::s>(char32_t c) {
    return cp_is<category::s>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sc>(char32_t c) {
    return cp_is<category::sc>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sk>(char32_t c) {
    return cp_is<category::sk>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sm>(char32_t c) {
    return cp_is<category::sm>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::so>(char32_t c) {
    return cp_is<category::so>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::z>(char32_t c) {
    return cp_is<category::z>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zl>(char32_t c) {
    return cp_is<category::zl>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zp>(char32_t c) {
    return cp_is<category::zp>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zs>(char32_t c) {
    return cp_is<category::zs>(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::adlm>(char32_t c) {
    return cp_script(c) == script::adlm;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::aghb>(char32_t c) {
    return cp_script(c) == script::aghb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ahom>(char32_t c) {
    return cp_script(c) == script::ahom;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::arab>(char32_t c) {
    return cp_script(c) == script::arab;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::armi>(char32_t c) {
    return cp_script(c) == script::armi;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::armn>(char32_t c) {
    return cp_script(c) == script::armn;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::avst>(char32_t c) {
    return cp_script(c) == script::avst;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bali>(char32_t c) {
    return cp_script(c) == script::bali;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bamu>(char32_t c) {
    return cp_script(c) == script::bamu;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bass>(char32_t c) {
    return cp_script(c) == script::bass;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::batk>(char32_t c) {
    return cp_script(c) == script::batk;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::beng>(char32_t c) {
    return cp_script(c) == script::beng;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bhks>(char32_t c) {
    return cp_script(c) == script::bhks;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bopo>(char32_t c) {
    return cp_script(c) == script::bopo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::brah>(char32_t c) {
    return cp_script(c) == script::brah;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::brai>(char32_t c) {
    return cp_script(c) == script::brai;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::bugi>(char32_t c) {
    return cp_script(c) == script::bugi;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::buhd>(char32_t c) {
    return cp_script(c) == script::buhd;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cakm>(char32_t c) {
    return cp_script(c) == script::cakm;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cans>(char32_t c) {
    return cp_script(c) == script::cans;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cari>(char32_t c) {
    return cp_script(c) == script::cari;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cham>(char32_t c) {
    return cp_script(c) == script::cham;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cher>(char32_t c) {
    return cp_script(c) == script::cher;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::copt>(char32_t c) {
    return cp_script(c) == script::copt;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cprt>(char32_t c) {
    return cp_script(c) == script::cprt;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::cyrl>(char32_t c) {
    return cp_script(c) == script::cyrl;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::deva>(char32_t c) {
    return cp_script(c) == script::deva;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::dogr>(char32_t c) {
    return cp_script(c) == script::dogr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::dsrt>(char32_t c) {
    return cp_script(c) == script::dsrt;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::dupl>(char32_t c) {
    return cp_script(c) == script::dupl;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::egyp>(char32_t c) {
    return cp_script(c) == script::egyp;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::elba>(char32_t c) {
    return cp_script(c) == script::elba;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::elym>(char32_t c) {
    return cp_script(c) == script::elym;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ethi>(char32_t c) {
    return cp_script(c) == script::ethi;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::geor>(char32_t c) {
    return cp_script(c) == script::geor;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::glag>(char32_t c) {
    return cp_script(c) == script::glag;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::gong>(char32_t c) {
    return cp_script(c) == script::gong;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::gonm>(char32_t c) {
    return cp_script(c) == script::gonm;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::goth>(char32_t c) {
    return cp_script(c) == script::goth;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::gran>(char32_t c) {
    return cp_script(c) == script::gran;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::grek>(char32_t c) {
    return cp_script(c) == script::grek;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::gujr>(char32_t c) {
    return cp_script(c) == script::gujr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::guru>(char32_t c) {
    return cp_script(c) == script::guru;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hang>(char32_t c) {
    return cp_script(c) == script::hang;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hani>(char32_t c) {
    return cp_script(c) == script::hani;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hano>(char32_t c) {
    return cp_script(c) == script::hano;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hatr>(char32_t c) {
    return cp_script(c) == script::hatr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hebr>(char32_t c) {
    return cp_script(c) == script::hebr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hira>(char32_t c) {
    return cp_script(c) == script::hira;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hluw>(char32_t c) {
    return cp_script(c) == script::hluw;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hmng>(char32_t c) {
    return cp_script(c) == script::hmng;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hmnp>(char32_t c) {
    return cp_script(c) == script::hmnp;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hrkt>(char32_t c) {
    return cp_script(c) == script::hrkt;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::hung>(char32_t c) {
    return cp_script(c) == script::hung;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ital>(char32_t c) {
    return cp_script(c) == script::ital;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::java>(char32_t c) {
    return cp_script(c) == script::java;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::kali>(char32_t c) {
    return cp_script(c) == script::kali;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::kana>(char32_t c) {
    return cp_script(c) == script::kana;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::khar>(char32_t c) {
    return cp_script(c) == script::khar;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::khmr>(char32_t c) {
    return cp_script(c) == script::khmr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::khoj>(char32_t c) {
    return cp_script(c) == script::khoj;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::knda>(char32_t c) {
    return cp_script(c) == script::knda;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::kthi>(char32_t c) {
    return cp_script(c) == script::kthi;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lana>(char32_t c) {
    return cp_script(c) == script::lana;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::laoo>(char32_t c) {
    return cp_script(c) == script::laoo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::latn>(char32_t c) {
    return cp_script(c) == script::latn;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lepc>(char32_t c) {
    return cp_script(c) == script::lepc;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::limb>(char32_t c) {
    return cp_script(c) == script::limb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lina>(char32_t c) {
    return cp_script(c) == script::lina;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::linb>(char32_t c) {
    return cp_script(c) == script::linb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lisu>(char32_t c) {
    return cp_script(c) == script::lisu;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lyci>(char32_t c) {
    return cp_script(c) == script::lyci;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::lydi>(char32_t c) {
    return cp_script(c) == script::lydi;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mahj>(char32_t c) {
    return cp_script(c) == script::mahj;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::maka>(char32_t c) {
    return cp_script(c) == script::maka;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mand>(char32_t c) {
    return cp_script(c) == script::mand;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mani>(char32_t c) {
    return cp_script(c) == script::mani;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::marc>(char32_t c) {
    return cp_script(c) == script::marc;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::medf>(char32_t c) {
    return cp_script(c) == script::medf;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mend>(char32_t c) {
    return cp_script(c) == script::mend;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::merc>(char32_t c) {
    return cp_script(c) == script::merc;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mero>(char32_t c) {
    return cp_script(c) == script::mero;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mlym>(char32_t c) {
    return cp_script(c) == script::mlym;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::modi>(char32_t c) {
    return cp_script(c) == script::modi;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mong>(char32_t c) {
    return cp_script(c) == script::mong;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mroo>(char32_t c) {
    return cp_script(c) == script::mroo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mtei>(char32_t c) {
    return cp_script(c) == script::mtei;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mult>(char32_t c) {
    return cp_script(c) == script::mult;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::mymr>(char32_t c) {
    return cp_script(c) == script::mymr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nand>(char32_t c) {
    return cp_script(c) == script::nand;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::narb>(char32_t c) {
    return cp_script(c) == script::narb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nbat>(char32_t c) {
    return cp_script(c) == script::nbat;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::newa>(char32_t c) {
    return cp_script(c) == script::newa;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nkoo>(char32_t c) {
    return cp_script(c) == script::nkoo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::nshu>(char32_t c) {
    return cp_script(c) == script::nshu;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ogam>(char32_t c) {
    return cp_script(c) == script::ogam;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::olck>(char32_t c) {
    return cp_script(c) == script::olck;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::orkh>(char32_t c) {
    return cp_script(c) == script::orkh;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::orya>(char32_t c) {
    return cp_script(c) == script::orya;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::osge>(char32_t c) {
    return cp_script(c) == script::osge;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::osma>(char32_t c) {
    return cp_script(c) == script::osma;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::palm>(char32_t c) {
    return cp_script(c) == script::palm;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::pauc>(char32_t c) {
    return cp_script(c) == script::pauc;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::perm>(char32_t c) {
    return cp_script(c) == script::perm;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::phag>(char32_t c) {
    return cp_script(c) == script::phag;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::phli>(char32_t c) {
    return cp_script(c) == script::phli;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::phlp>(char32_t c) {
    return cp_script(c) == script::phlp;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::phnx>(char32_t c) {
    return cp_script(c) == script::phnx;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::plrd>(char32_t c) {
    return cp_script(c) == script::plrd;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::prti>(char32_t c) {
    return cp_script(c) == script::prti;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::rjng>(char32_t c) {
    return cp_script(c) == script::rjng;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::rohg>(char32_t c) {
    return cp_script(c) == script::rohg;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::runr>(char32_t c) {
    return cp_script(c) == script::runr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::samr>(char32_t c) {
    return cp_script(c) == script::samr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sarb>(char32_t c) {
    return cp_script(c) == script::sarb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::saur>(char32_t c) {
    return cp_script(c) == script::saur;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sgnw>(char32_t c) {
    return cp_script(c) == script::sgnw;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::shaw>(char32_t c) {
    return cp_script(c) == script::shaw;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::shrd>(char32_t c) {
    return cp_script(c) == script::shrd;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sidd>(char32_t c) {
    return cp_script(c) == script::sidd;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sind>(char32_t c) {
    return cp_script(c) == script::sind;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sinh>(char32_t c) {
    return cp_script(c) == script::sinh;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sogd>(char32_t c) {
    return cp_script(c) == script::sogd;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sogo>(char32_t c) {
    return cp_script(c) == script::sogo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sora>(char32_t c) {
    return cp_script(c) == script::sora;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::soyo>(char32_t c) {
    return cp_script(c) == script::soyo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sund>(char32_t c) {
    return cp_script(c) == script::sund;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::sylo>(char32_t c) {
    return cp_script(c) == script::sylo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::syrc>(char32_t c) {
    return cp_script(c) == script::syrc;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tagb>(char32_t c) {
    return cp_script(c) == script::tagb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::takr>(char32_t c) {
    return cp_script(c) == script::takr;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tale>(char32_t c) {
    return cp_script(c) == script::tale;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::talu>(char32_t c) {
    return cp_script(c) == script::talu;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::taml>(char32_t c) {
    return cp_script(c) == script::taml;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tang>(char32_t c) {
    return cp_script(c) == script::tang;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tavt>(char32_t c) {
    return cp_script(c) == script::tavt;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::telu>(char32_t c) {
    return cp_script(c) == script::telu;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tfng>(char32_t c) {
    return cp_script(c) == script::tfng;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tglg>(char32_t c) {
    return cp_script(c) == script::tglg;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::thaa>(char32_t c) {
    return cp_script(c) == script::thaa;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::thai>(char32_t c) {
    return cp_script(c) == script::thai;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tibt>(char32_t c) {
    return cp_script(c) == script::tibt;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::tirh>(char32_t c) {
    return cp_script(c) == script::tirh;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ugar>(char32_t c) {
    return cp_script(c) == script::ugar;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::vaii>(char32_t c) {
    return cp_script(c) == script::vaii;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::wara>(char32_t c) {
    return cp_script(c) == script::wara;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::wcho>(char32_t c) {
    return cp_script(c) == script::wcho;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::xpeo>(char32_t c) {
    return cp_script(c) == script::xpeo;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::xsux>(char32_t c) {
    return cp_script(c) == script::xsux;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::yiii>(char32_t c) {
    return cp_script(c) == script::yiii;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zanb>(char32_t c) {
    return cp_script(c) == script::zanb;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zinh>(char32_t c) {
    return cp_script(c) == script::zinh;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zyyy>(char32_t c) {
    return cp_script(c) == script::zyyy;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::zzzz>(char32_t c) {
    return cp_script(c) == script::zzzz;
}
static constexpr const std::array __binary_prop_names = {
    __string_with_idx{"adlam", 86},
    __string_with_idx{"adlm", 86},
    __string_with_idx{"aghb", 87},
    __string_with_idx{"ahex", 0},
    __string_with_idx{"ahom", 88},
    __string_with_idx{"alpha", 1},
    __string_with_idx{"alphabetic", 1},
    __string_with_idx{"anatolian_hieroglyphs", 135},
    __string_with_idx{"any", 45},
    __string_with_idx{"arab", 89},
    __string_with_idx{"arabic", 89},
    __string_with_idx{"armenian", 91},
    __string_with_idx{"armi", 90},
    __string_with_idx{"armn", 91},
    __string_with_idx{"ascii", 46},
    __string_with_idx{"ascii_hex_digit", 0},
    __string_with_idx{"assigned", 47},
    __string_with_idx{"avestan", 92},
    __string_with_idx{"avst", 92},
    __string_with_idx{"bali", 93},
    __string_with_idx{"balinese", 93},
    __string_with_idx{"bamu", 94},
    __string_with_idx{"bamum", 94},
    __string_with_idx{"bass", 95},
    __string_with_idx{"bassa_vah", 95},
    __string_with_idx{"batak", 96},
    __string_with_idx{"batk", 96},
    __string_with_idx{"beng", 97},
    __string_with_idx{"bengali", 97},
    __string_with_idx{"bhaiksuki", 98},
    __string_with_idx{"bhks", 98},
    __string_with_idx{"bidi_c", 2},
    __string_with_idx{"bidi_control", 2},
    __string_with_idx{"bidi_m", 3},
    __string_with_idx{"bidi_mirrored", 3},
    __string_with_idx{"bopo", 99},
    __string_with_idx{"bopomofo", 99},
    __string_with_idx{"brah", 100},
    __string_with_idx{"brahmi", 100},
    __string_with_idx{"brai", 101},
    __string_with_idx{"braille", 101},
    __string_with_idx{"bugi", 102},
    __string_with_idx{"buginese", 102},
    __string_with_idx{"buhd", 103},
    __string_with_idx{"buhid", 103},
    __string_with_idx{"c", 48},
    __string_with_idx{"cakm", 104},
    __string_with_idx{"canadian_aboriginal", 105},
    __string_with_idx{"cans", 105},
    __string_with_idx{"cari", 106},
    __string_with_idx{"carian", 106},
    __string_with_idx{"case_ignorable", 5},
    __string_with_idx{"cased", 4},
    __string_with_idx{"cased_letter", 55},
    __string_with_idx{"caucasian_albanian", 87},
    __string_with_idx{"cc", 49},
    __string_with_idx{"cf", 50},
    __string_with_idx{"chakma", 104},
    __string_with_idx{"cham", 107},
    __string_with_idx{"cher", 108},
    __string_with_idx{"cherokee", 108},
    __string_with_idx{"ci", 5},
    __string_with_idx{"close_punctuation", 72},
    __string_with_idx{"cn", 51},
    __string_with_idx{"co", 52},
    __string_with_idx{"common", 238},
    __string_with_idx{"connector_punctuation", 70},
    __string_with_idx{"control", 49},
    __string_with_idx{"copt", 109},
    __string_with_idx{"coptic", 109},
    __string_with_idx{"cprt", 110},
    __string_with_idx{"cs", 53},
    __string_with_idx{"cuneiform", 234},
    __string_with_idx{"currency_symbol", 78},
    __string_with_idx{"cypriot", 110},
    __string_with_idx{"cyrillic", 111},
    __string_with_idx{"cyrl", 111},
    __string_with_idx{"dash", 6},
    __string_with_idx{"dash_punctuation", 71},
    __string_with_idx{"decimal_number", 66},
    __string_with_idx{"default_ignorable_code_point", 8},
    __string_with_idx{"dep", 7},
    __string_with_idx{"deprecated", 7},
    __string_with_idx{"deseret", 114},
    __string_with_idx{"deva", 112},
    __string_with_idx{"devanagari", 112},
    __string_with_idx{"di", 8},
    __string_with_idx{"dia", 9},
    __string_with_idx{"diacritic", 9},
    __string_with_idx{"dogr", 113},
    __string_with_idx{"dogra", 113},
    __string_with_idx{"dsrt", 114},
    __string_with_idx{"dupl", 115},
    __string_with_idx{"duployan", 115},
    __string_with_idx{"egyp", 116},
    __string_with_idx{"egyptian_hieroglyphs", 116},
    __string_with_idx{"elba", 117},
    __string_with_idx{"elbasan", 117},
    __string_with_idx{"elym", 118},
    __string_with_idx{"elymaic", 118},
    __string_with_idx{"emoji", 10},
    __string_with_idx{"emoji_component", 11},
    __string_with_idx{"emoji_modifier", 12},
    __string_with_idx{"emoji_modifier_base", 13},
    __string_with_idx{"emoji_presentation", 14},
    __string_with_idx{"enclosing_mark", 63},
    __string_with_idx{"ethi", 119},
    __string_with_idx{"ethiopic", 119},
    __string_with_idx{"ext", 15},
    __string_with_idx{"extended_pictographic", 16},
    __string_with_idx{"extender", 15},
    __string_with_idx{"final_punctuation", 73},
    __string_with_idx{"format", 50},
    __string_with_idx{"geor", 120},
    __string_with_idx{"georgian", 120},
    __string_with_idx{"glag", 121},
    __string_with_idx{"glagolitic", 121},
    __string_with_idx{"gong", 122},
    __string_with_idx{"gonm", 123},
    __string_with_idx{"goth", 124},
    __string_with_idx{"gothic", 124},
    __string_with_idx{"gr_base", 17},
    __string_with_idx{"gr_ext", 18},
    __string_with_idx{"gran", 125},
    __string_with_idx{"grantha", 125},
    __string_with_idx{"grapheme_base", 17},
    __string_with_idx{"grapheme_extend", 18},
    __string_with_idx{"greek", 126},
    __string_with_idx{"grek", 126},
    __string_with_idx{"gujarati", 127},
    __string_with_idx{"gujr", 127},
    __string_with_idx{"gunjala_gondi", 122},
    __string_with_idx{"gurmukhi", 128},
    __string_with_idx{"guru", 128},
    __string_with_idx{"han", 130},
    __string_with_idx{"hang", 129},
    __string_with_idx{"hangul", 129},
    __string_with_idx{"hani", 130},
    __string_with_idx{"hanifi_rohingya", 197},
    __string_with_idx{"hano", 131},
    __string_with_idx{"hanunoo", 131},
    __string_with_idx{"hatr", 132},
    __string_with_idx{"hatran", 132},
    __string_with_idx{"hebr", 133},
    __string_with_idx{"hebrew", 133},
    __string_with_idx{"hex", 19},
    __string_with_idx{"hex_digit", 19},
    __string_with_idx{"hira", 134},
    __string_with_idx{"hiragana", 134},
    __string_with_idx{"hluw", 135},
    __string_with_idx{"hmng", 136},
    __string_with_idx{"hmnp", 137},
    __string_with_idx{"hrkt", 138},
    __string_with_idx{"hung", 139},
    __string_with_idx{"id_continue", 20},
    __string_with_idx{"id_start", 22},
    __string_with_idx{"idc", 20},
    __string_with_idx{"ideo", 21},
    __string_with_idx{"ideographic", 21},
    __string_with_idx{"ids", 22},
    __string_with_idx{"ids_binary_operator", 23},
    __string_with_idx{"ids_trinary_operator", 24},
    __string_with_idx{"idsb", 23},
    __string_with_idx{"idst", 24},
    __string_with_idx{"imperial_aramaic", 90},
    __string_with_idx{"inherited", 237},
    __string_with_idx{"initial_punctuation", 74},
    __string_with_idx{"inscriptional_pahlavi", 191},
    __string_with_idx{"inscriptional_parthian", 195},
    __string_with_idx{"ital", 140},
    __string_with_idx{"java", 141},
    __string_with_idx{"javanese", 141},
    __string_with_idx{"join_c", 25},
    __string_with_idx{"join_control", 25},
    __string_with_idx{"kaithi", 148},
    __string_with_idx{"kali", 142},
    __string_with_idx{"kana", 143},
    __string_with_idx{"kannada", 147},
    __string_with_idx{"katakana", 143},
    __string_with_idx{"katakana_or_hiragana", 138},
    __string_with_idx{"kayah_li", 142},
    __string_with_idx{"khar", 144},
    __string_with_idx{"kharoshthi", 144},
    __string_with_idx{"khmer", 145},
    __string_with_idx{"khmr", 145},
    __string_with_idx{"khoj", 146},
    __string_with_idx{"khojki", 146},
    __string_with_idx{"khudawadi", 206},
    __string_with_idx{"knda", 147},
    __string_with_idx{"kthi", 148},
    __string_with_idx{"l", 54},
    __string_with_idx{"lana", 149},
    __string_with_idx{"lao", 150},
    __string_with_idx{"laoo", 150},
    __string_with_idx{"latin", 151},
    __string_with_idx{"latn", 151},
    __string_with_idx{"lc", 55},
    __string_with_idx{"lepc", 152},
    __string_with_idx{"lepcha", 152},
    __string_with_idx{"letter", 54},
    __string_with_idx{"letter_number", 67},
    __string_with_idx{"limb", 153},
    __string_with_idx{"limbu", 153},
    __string_with_idx{"lina", 154},
    __string_with_idx{"linb", 155},
    __string_with_idx{"line_separator", 83},
    __string_with_idx{"linear_a", 154},
    __string_with_idx{"linear_b", 155},
    __string_with_idx{"lisu", 156},
    __string_with_idx{"ll", 56},
    __string_with_idx{"lm", 57},
    __string_with_idx{"lo", 58},
    __string_with_idx{"loe", 26},
    __string_with_idx{"logical_order_exception", 26},
    __string_with_idx{"lower", 27},
    __string_with_idx{"lowercase", 27},
    __string_with_idx{"lowercase_letter", 56},
    __string_with_idx{"lt", 59},
    __string_with_idx{"lu", 60},
    __string_with_idx{"lyci", 157},
    __string_with_idx{"lycian", 157},
    __string_with_idx{"lydi", 158},
    __string_with_idx{"lydian", 158},
    __string_with_idx{"m", 61},
    __string_with_idx{"mahajani", 159},
    __string_with_idx{"mahj", 159},
    __string_with_idx{"maka", 160},
    __string_with_idx{"makasar", 160},
    __string_with_idx{"malayalam", 168},
    __string_with_idx{"mand", 161},
    __string_with_idx{"mandaic", 161},
    __string_with_idx{"mani", 162},
    __string_with_idx{"manichaean", 162},
    __string_with_idx{"marc", 163},
    __string_with_idx{"marchen", 163},
    __string_with_idx{"mark", 61},
    __string_with_idx{"masaram_gondi", 123},
    __string_with_idx{"math", 28},
    __string_with_idx{"math_symbol", 80},
    __string_with_idx{"mc", 62},
    __string_with_idx{"me", 63},
    __string_with_idx{"medefaidrin", 164},
    __string_with_idx{"medf", 164},
    __string_with_idx{"meetei_mayek", 172},
    __string_with_idx{"mend", 165},
    __string_with_idx{"mende_kikakui", 165},
    __string_with_idx{"merc", 166},
    __string_with_idx{"mero", 167},
    __string_with_idx{"meroitic_cursive", 166},
    __string_with_idx{"meroitic_hieroglyphs", 167},
    __string_with_idx{"miao", 194},
    __string_with_idx{"mlym", 168},
    __string_with_idx{"mn", 64},
    __string_with_idx{"modi", 169},
    __string_with_idx{"modifier_letter", 57},
    __string_with_idx{"modifier_symbol", 79},
    __string_with_idx{"mong", 170},
    __string_with_idx{"mongolian", 170},
    __string_with_idx{"mro", 171},
    __string_with_idx{"mroo", 171},
    __string_with_idx{"mtei", 172},
    __string_with_idx{"mult", 173},
    __string_with_idx{"multani", 173},
    __string_with_idx{"myanmar", 174},
    __string_with_idx{"mymr", 174},
    __string_with_idx{"n", 65},
    __string_with_idx{"nabataean", 177},
    __string_with_idx{"nand", 175},
    __string_with_idx{"nandinagari", 175},
    __string_with_idx{"narb", 176},
    __string_with_idx{"nbat", 177},
    __string_with_idx{"nchar", 29},
    __string_with_idx{"nd", 66},
    __string_with_idx{"new_tai_lue", 218},
    __string_with_idx{"newa", 178},
    __string_with_idx{"nko", 179},
    __string_with_idx{"nkoo", 179},
    __string_with_idx{"nl", 67},
    __string_with_idx{"no", 68},
    __string_with_idx{"noncharacter_code_point", 29},
    __string_with_idx{"nonspacing_mark", 64},
    __string_with_idx{"nshu", 180},
    __string_with_idx{"number", 65},
    __string_with_idx{"nushu", 180},
    __string_with_idx{"nyiakeng_puachue_hmong", 137},
    __string_with_idx{"ogam", 181},
    __string_with_idx{"ogham", 181},
    __string_with_idx{"ol_chiki", 182},
    __string_with_idx{"olck", 182},
    __string_with_idx{"old_hungarian", 139},
    __string_with_idx{"old_italic", 140},
    __string_with_idx{"old_north_arabian", 176},
    __string_with_idx{"old_permic", 189},
    __string_with_idx{"old_persian", 233},
    __string_with_idx{"old_sogdian", 209},
    __string_with_idx{"old_south_arabian", 200},
    __string_with_idx{"old_turkic", 183},
    __string_with_idx{"open_punctuation", 76},
    __string_with_idx{"oriya", 184},
    __string_with_idx{"orkh", 183},
    __string_with_idx{"orya", 184},
    __string_with_idx{"osage", 185},
    __string_with_idx{"osge", 185},
    __string_with_idx{"osma", 186},
    __string_with_idx{"osmanya", 186},
    __string_with_idx{"other", 48},
    __string_with_idx{"other_letter", 58},
    __string_with_idx{"other_number", 68},
    __string_with_idx{"other_punctuation", 75},
    __string_with_idx{"other_symbol", 81},
    __string_with_idx{"p", 69},
    __string_with_idx{"pahawh_hmong", 136},
    __string_with_idx{"palm", 187},
    __string_with_idx{"palmyrene", 187},
    __string_with_idx{"paragraph_separator", 84},
    __string_with_idx{"pat_syn", 30},
    __string_with_idx{"pat_ws", 31},
    __string_with_idx{"pattern_syntax", 30},
    __string_with_idx{"pattern_white_space", 31},
    __string_with_idx{"pau_cin_hau", 188},
    __string_with_idx{"pauc", 188},
    __string_with_idx{"pc", 70},
    __string_with_idx{"pcm", 32},
    __string_with_idx{"pd", 71},
    __string_with_idx{"pe", 72},
    __string_with_idx{"perm", 189},
    __string_with_idx{"pf", 73},
    __string_with_idx{"phag", 190},
    __string_with_idx{"phags_pa", 190},
    __string_with_idx{"phli", 191},
    __string_with_idx{"phlp", 192},
    __string_with_idx{"phnx", 193},
    __string_with_idx{"phoenician", 193},
    __string_with_idx{"pi", 74},
    __string_with_idx{"plrd", 194},
    __string_with_idx{"po", 75},
    __string_with_idx{"prepended_concatenation_mark", 32},
    __string_with_idx{"private_use", 52},
    __string_with_idx{"prti", 195},
    __string_with_idx{"ps", 76},
    __string_with_idx{"psalter_pahlavi", 192},
    __string_with_idx{"punctuation", 69},
    __string_with_idx{"qmark", 33},
    __string_with_idx{"quotation_mark", 33},
    __string_with_idx{"radical", 34},
    __string_with_idx{"regional_indicator", 35},
    __string_with_idx{"rejang", 196},
    __string_with_idx{"ri", 35},
    __string_with_idx{"rjng", 196},
    __string_with_idx{"rohg", 197},
    __string_with_idx{"runic", 198},
    __string_with_idx{"runr", 198},
    __string_with_idx{"s", 77},
    __string_with_idx{"samaritan", 199},
    __string_with_idx{"samr", 199},
    __string_with_idx{"sarb", 200},
    __string_with_idx{"saur", 201},
    __string_with_idx{"saurashtra", 201},
    __string_with_idx{"sc", 78},
    __string_with_idx{"sd", 36},
    __string_with_idx{"sentence_terminal", 37},
    __string_with_idx{"separator", 82},
    __string_with_idx{"sgnw", 202},
    __string_with_idx{"sharada", 204},
    __string_with_idx{"shavian", 203},
    __string_with_idx{"shaw", 203},
    __string_with_idx{"shrd", 204},
    __string_with_idx{"sidd", 205},
    __string_with_idx{"siddham", 205},
    __string_with_idx{"signwriting", 202},
    __string_with_idx{"sind", 206},
    __string_with_idx{"sinh", 207},
    __string_with_idx{"sinhala", 207},
    __string_with_idx{"sk", 79},
    __string_with_idx{"sm", 80},
    __string_with_idx{"so", 81},
    __string_with_idx{"soft_dotted", 36},
    __string_with_idx{"sogd", 208},
    __string_with_idx{"sogdian", 208},
    __string_with_idx{"sogo", 209},
    __string_with_idx{"sora", 210},
    __string_with_idx{"sora_sompeng", 210},
    __string_with_idx{"soyo", 211},
    __string_with_idx{"soyombo", 211},
    __string_with_idx{"space", 42},
    __string_with_idx{"space_separator", 85},
    __string_with_idx{"spacing_mark", 62},
    __string_with_idx{"sterm", 37},
    __string_with_idx{"sund", 212},
    __string_with_idx{"sundanese", 212},
    __string_with_idx{"surrogate", 53},
    __string_with_idx{"sylo", 213},
    __string_with_idx{"syloti_nagri", 213},
    __string_with_idx{"symbol", 77},
    __string_with_idx{"syrc", 214},
    __string_with_idx{"syriac", 214},
    __string_with_idx{"tagalog", 224},
    __string_with_idx{"tagb", 215},
    __string_with_idx{"tagbanwa", 215},
    __string_with_idx{"tai_le", 217},
    __string_with_idx{"tai_tham", 149},
    __string_with_idx{"tai_viet", 221},
    __string_with_idx{"takr", 216},
    __string_with_idx{"takri", 216},
    __string_with_idx{"tale", 217},
    __string_with_idx{"talu", 218},
    __string_with_idx{"tamil", 219},
    __string_with_idx{"taml", 219},
    __string_with_idx{"tang", 220},
    __string_with_idx{"tangut", 220},
    __string_with_idx{"tavt", 221},
    __string_with_idx{"telu", 222},
    __string_with_idx{"telugu", 222},
    __string_with_idx{"term", 38},
    __string_with_idx{"terminal_punctuation", 38},
    __string_with_idx{"tfng", 223},
    __string_with_idx{"tglg", 224},
    __string_with_idx{"thaa", 225},
    __string_with_idx{"thaana", 225},
    __string_with_idx{"thai", 226},
    __string_with_idx{"tibetan", 227},
    __string_with_idx{"tibt", 227},
    __string_with_idx{"tifinagh", 223},
    __string_with_idx{"tirh", 228},
    __string_with_idx{"tirhuta", 228},
    __string_with_idx{"titlecase_letter", 59},
    __string_with_idx{"ugar", 229},
    __string_with_idx{"ugaritic", 229},
    __string_with_idx{"uideo", 39},
    __string_with_idx{"unassigned", 51},
    __string_with_idx{"unified_ideograph", 39},
    __string_with_idx{"unknown", 239},
    __string_with_idx{"upper", 40},
    __string_with_idx{"uppercase", 40},
    __string_with_idx{"uppercase_letter", 60},
    __string_with_idx{"vai", 230},
    __string_with_idx{"vaii", 230},
    __string_with_idx{"variation_selector", 41},
    __string_with_idx{"vs", 41},
    __string_with_idx{"wancho", 232},
    __string_with_idx{"wara", 231},
    __string_with_idx{"warang_citi", 231},
    __string_with_idx{"wcho", 232},
    __string_with_idx{"white_space", 42},
    __string_with_idx{"wspace", 42},
    __string_with_idx{"xid_continue", 43},
    __string_with_idx{"xid_start", 44},
    __string_with_idx{"xidc", 43},
    __string_with_idx{"xids", 44},
    __string_with_idx{"xpeo", 233},
    __string_with_idx{"xsux", 234},
    __string_with_idx{"yi", 235},
    __string_with_idx{"yiii", 235},
    __string_with_idx{"z", 82},
    __string_with_idx{"zanabazar_square", 236},
    __string_with_idx{"zanb", 236},
    __string_with_idx{"zinh", 237},
    __string_with_idx{"zl", 83},
    __string_with_idx{"zp", 84},
    __string_with_idx{"zs", 85},
    __string_with_idx{"zyyy", 238},
    __string_with_idx{"zzzz", 239}};
}    // namespace uni

// More regex support for ctre

namespace uni {


constexpr __binary_prop __binary_prop_from_string(const std::string_view s) {
    for(std::size_t i = 0; i < __binary_prop_names.size(); ++i) {
        const auto& c = __binary_prop_names[i];
        const auto res = __pronamecomp(s, c.name);
        if(res == 0)
            return __binary_prop(c.value);
    }
    return __binary_prop::unknown;
}

template<>
constexpr bool __get_binary_prop<__binary_prop::ascii>(char32_t c) {
    return cp_is_ascii(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::assigned>(char32_t c) {
    return cp_is_assigned(c);
}

template<>
constexpr bool __get_binary_prop<__binary_prop::any>(char32_t c) {
    return cp_is_valid(c);
}

}    // namespace uni